加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

php 多线程上下文中安全写文件实现代码

发布时间:2020-05-24 22:30:43 所属栏目:PHP 来源:互联网
导读:提供一个php多线程上下文中安全写文件的实现方法。这个实现没有使用php 的file lock机制,使用的是临时文件机制。多线程中的各个线程都是对各自(每个线程独占一个)的临时文件写,然后再同步到原文件中。

<div class="codetitle"><a style="CURSOR: pointer" data="66233" class="copybut" id="copybut66233" onclick="doCopy('code66233')"> 代码如下:<div class="codebody" id="code66233">
<?php
/*
@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);
*/
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);
isdir($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;
}
?>

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读