PHP多进程写入文件

当多个进程需要对文件进行操作时,为了避免其中出现的种种问题,可对文件进行一个列队的方式处理,当处理完一个进程后,第二个进程继续……

用到的系统函数有: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');
?>

2 Responses to “PHP多进程写入文件”

Leave a Reply

(will not be published)