php多进程写一个文件,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 测试一个文件是否存在

$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');

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值