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 相关文章推荐
用PHP调用Oracle存储过程
Oct 09 PHP
PHP开发的一些注意点总结
Oct 12 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
Feb 13 PHP
php表单提交与$_POST实例分析
Jan 26 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
Apr 15 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
Jun 21 PHP
php封装的图片(缩略图)处理类完整实例
Oct 19 PHP
PHP回调函数简单用法示例
May 08 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
Oct 23 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 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
图书管理程序(三)
2006/10/09 PHP
PHP STRING 陷阱原理说明
2010/07/24 PHP
PHP内存缓存Memcached类实例
2014/12/08 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
iframe调用父页面函数示例详解
2014/07/17 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
[58:57]2018DOTA2亚洲邀请赛3月29日小组赛B组 Effect VS VGJ.T
2018/03/30 DOTA
python字符串编码识别模块chardet简单应用
2015/06/15 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
python ddt实现数据驱动
2018/03/14 Python
使用python编写监听端
2018/04/12 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
python socket 聊天室实例代码详解
2019/11/14 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
基于python3的socket聊天编程
2020/02/17 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
大学生就业意向书范文
2014/04/01 职场文书
诚信贷款承诺书
2014/05/30 职场文书
工程项目经理任命书
2014/06/05 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏