当多个进程需要对文件进行操作时,为了避免其中出现的种种问题,可对文件进行一个列队的方式处理,当处理完一个进程后,第二个进程继续……
用到的系统函数有:file_exists(),usleep(),file_put_contents(),fopen(),fwrite(),fclose(),unlink()。
file_exists() 检查文件或目录是否存在
//bool file_exists ( string $filename )
//如果由 filename 指定的文件或目录存在则返回 TRUE,否则返回 FALSE。
//在 Windows 中要用 //computername/share/filename 或者 \\computername\share\filename 来检查网络中的共享文件。
如果由 filename 指定的文件或目录存在则返回 TRUE,否则返回 FALSE。
Example #1 测试一个文件是否存在
$filename = '/path/to/foo.txt';
if (file_exists($filename)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
?>
usleep() 在几微秒的延迟执行
//void usleep ( int $micro_seconds )
//延迟程序执行给定数量的微秒。
Example #1 usleep() example
// Current time
echo date('h:i:s') . "\n";
// wait for 2 seconds
usleep(2000000);
// back!
echo date('h:i:s') . "\n";
//结果
//11:13:28
//11:13:30
?>
file_put_contents() 将一个字符串写入文件
int file_put_contents ( string $filename , string $data [, int $flags [, resource $context ]] )
/*和依次调用 fopen(),fwrite()以及 fclose() 功能一样。
参数 data 可以是数组(但不能为多维数组),这就相当于 file_put_contents($filename, join('', $array))
自 PHP 5.1.0 起,data参数也可以被指定为 stream 资源,这里 stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。*/
//参数
/*
filename
要被写入数据的文件名。
data
要写入的数据。类型可以是 string,array或者是 stream 资源(如上面所说的那样)。
flags
flags 可以是 FILE_USE_INCLUDE_PATH,FILE_APPEND和/或 LOCK_EX(获得一个独占锁定),然而使用 FILE_USE_INCLUDE_PATH 时要特别谨慎。
context
一个 context 资源。
*/
unlink() — 删除文件
//bool unlink ( string $filename )
//删除 filename。和 Unix C 的 unlink() 函数相似。成功时返回 TRUE, 或者在失败时返回 FALSE.
//Note: 自 PHP 5.0.0 起 unlink() 也可以用于某些URL 封装协议。参考Supported Protocols and Wrappers 中的列表看哪些封装协议支持 unlink()。
//Note: 在 PHP 5.0.0 中增加了 对上下文(Context)的支持。 有关 上下文(Context) 的说明参见 Stream 函数。
//目录删除函数 rmdir()。
代码:
/**
* 多进程写入文件
*/
function write_file($filename, $text) {
$filename_lock = $filename . '.lock';
while ( 1 ) {
if (file_exists ( $filename_lock )) { // 判断加锁未见是否存在
usleep ( 1000 ); // 如果存在则以为妙计算进行sleep睡眠
} else { // .....
file_put_contents ( $filename_lock ); // 生成文件 touch()的效率没file_put_contents()高
$t = fopen ( $filename, 'a+' ); // 打开文件流
fwrite ( $t, $text ); // 写入文件
fclose ( $t ); // 关闭写入
//exit (); //test...
unlink ( $filename_lock ); // 删除加锁文件
break; // 跳出循环
}
}
if (file_exists ( $filename_lock )) {
unlink ( $filename_lock ); // 删除锁定文件
}
}
?>
DEMO:
// write_file('1.txt', '123123123');
?>