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


Posted in PHP onDecember 28, 2009
<?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); 
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 相关文章推荐
六酷社区论坛HOME页清新格调免费版 下载
Mar 07 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
Aug 07 PHP
PHP中SESSION使用中的一点经验总结
Mar 30 PHP
php模板函数 正则实现代码
Oct 15 PHP
解析php类的注册与自动加载
Jul 05 PHP
PHP验证码函数代码(简单实用)
Sep 29 PHP
PHP遍历文件夹与文件类及处理类用法实例
Sep 23 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
Nov 05 PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 PHP
常见的四种POST 提交数据方式(小总结)
Oct 08 PHP
jquery不支持toggle()高(新)版本的问题解决
Sep 24 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
PHP 获取目录下的图片并随机显示的代码
Dec 28 #PHP
phpMyAdmin链接MySql错误 个人解决方案
Dec 28 #PHP
php 需要掌握的东西 不做浮躁的人
Dec 28 #PHP
php 文章采集正则代码
Dec 28 #PHP
PHP array_push 数组函数
Dec 26 #PHP
PHP simple_html_dom.php+正则 采集文章代码
Dec 24 #PHP
在PHP中检查PHP文件是否有语法错误的方法
Dec 23 #PHP
You might like
PHP调用三种数据库的方法(2)
2006/10/09 PHP
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
PHP生成数组再传给js的方法
2014/08/07 PHP
php常用图片处理类
2016/03/16 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
Ajax一统天下之Dojo整合篇
2007/03/24 Javascript
Dojo 学习笔记入门篇 First Dojo Example
2009/11/15 Javascript
Dom与浏览器兼容性说明
2010/10/25 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
详解Python爬虫的基本写法
2016/01/08 Python
python3.5安装python3-tk详解
2019/04/26 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
缓刑人员的思想汇报
2014/01/11 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
趵突泉导游词
2015/02/03 职场文书
公司岗位说明书
2015/10/08 职场文书
个人道歉信大全
2019/04/11 职场文书
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL