当多个进程需要对文件进行操作时,为了避免其中出现的种种问题,可对文件进行一个列队的方式处理,当处理完一个进程后,第二个进程继续……
用到的系统函数有: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 测试一个文件是否存在
<?php $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
<?php // 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()。
代码:
<?php /** * 多进程写入文件 */ 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:
<?php // write_file('1.txt', '123123123'); ?>
很喜欢这个网页风格!顶一下
谢谢,我是比较喜欢这种简约。