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缓存函数的使用说明
May 10 PHP
ThinkPHP之N方法实例详解
Jun 20 PHP
thinkphp模板用法和内容输出实例
Nov 28 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
PHP使用Pthread实现的多线程操作实例
Nov 14 PHP
PHP开发制作一个简单的活动日程表Calendar
Jun 20 PHP
由php中字符offset特征造成的绕过漏洞详解
Jul 07 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
Nov 08 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
Jun 04 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 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+ajax实现无刷新数据分页的办法
2015/11/02 PHP
RSA实现JS前端加密与PHP后端解密功能示例
2019/08/05 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
Javascript 强制类型转换函数
2009/05/17 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
JS产生随机数的几个用法详解
2016/06/22 Javascript
JavaScript优化以及前段开发小技巧
2017/02/02 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
json数据传到前台并解析展示成列表的方法
2018/08/06 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
python调用cmd复制文件代码分享
2013/12/27 Python
python使用htmllib分析网页内容的方法
2015/05/08 Python
Python文件读取的3种方法及路径转义
2015/06/21 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
python 移除字符串尾部的数字方法
2018/07/17 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
Python实现的大数据分析操作系统日志功能示例
2019/02/11 Python
python多进程重复加载的解决方式
2019/12/13 Python
python Tensor和Array对比分析
2020/01/08 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
.NET remoting的两种通道是什么
2016/05/31 面试题
建筑专业自我鉴定
2013/10/22 职场文书
招聘专员岗位职责
2014/03/07 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
电大奖学金获奖感言
2014/08/14 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
万能检讨书2000字
2014/10/17 职场文书
仓管员岗位职责
2015/02/03 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
一文带你探究MySQL中的NULL
2021/11/11 MySQL
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android