php多线程写文件夹,php 多线程上下文中安全写文件的简单示例

本文提供了一个PHP实现的多线程上下文中安全写文件的示例,通过创建临时文件来避免并发写入冲突。作者RockyZhang在2009年11月分享了这一方法,涉及文件权限检查、临时文件生成和同步更新源文件的策略。
摘要由CSDN通过智能技术生成

这篇文章主要为大家详细介绍了php 多线程上下文中安全写文件的简单示例,具有一定的参考价值,可以用来参考一下。

感兴趣的小伙伴,下面一起跟随512笔记的小编小韵来看看吧!

代码如下:

/**

* @usage: used to offer safe file write operation in multiple threads context, arbitory file type

* @author: Rocky Zhang

* @time: Nov. 11 2009

* @demo[0]: $handler = mfopen($file, 'a+');

* mfwrite($handler, $str);

// 512笔记网 wWw.512PiC.Com

*/

function mfopen($file, $mode='w+') {

$tempfile = generateTempfile('./tempdir', $file);

preg_match('/b/i', $mode) || ($mode .= 'b'); // 'b' is recommended

if (preg_match('/\w|a/i', $mode) && !is_writable($file)) {

exit("{$file} is not writable!");

}

$filemtime = $filemtime2 = 0;

$tempdir = dirname($tempfile);

is_dir($tempdir) || mkdir($tempdir, 0777);

do { // do-while used to avoid modify in a long time copy

clearstatcache();

$filemtime = filemtime($file);

copy($file, $tempfile);

$filemtime2 = filemtime($file);

} while ( ($filemtime2 - $filemtime) != 0 );

if (!$handler = fopen($tempfile, $mode)) {

exit('Fail on opening tempfile, write authentication is must on temporary dir!');

}

return array(0=>$handler, 1=>$filemtime, 2=>$file, 3=>$tempfile, 4=>$mode);

}

// I do think that this function should be optimized further

function mfwrite(&$handler, $str='') {

if (strlen($str) > 0) {

$num = fwrite($handler[0], $str);

fflush($handler[0]);

}

clearstatcache();

$mtime = filemtime($handler[2]);

if ( $mtime == $handler[1] ) { // compare between source file and temporary file

if ( $num && $num > 0 ) { // temporary file has been updated, copy to source file

copy($handler[3], $handler[2]) || exit;

$handler[1] = filemtime($handler[3]);

touch($handler[2], $handler[1], $handler[1]);

}

} else { // source file has been modified, load source file to temporary file

copy($handler[2], $handler[3]) || exit;

touch($handler[3], $mtime, $mtime);

$handler[1] = $mtime;

}

}

function generateTempfile($tempdir='tempdir', $file) {

$rand = md5(microtime());

return "{$tempdir}/{$rand}_".$file;

}

?>

注:关于php 多线程上下文中安全写文件的简单示例的内容就先介绍到这里,更多相关文章的可以留意512笔记的其他信息。

关键词:

您可能感兴趣的文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值