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入门速成(2)
Oct 09 PHP
vBulletin HACK----关于排版的两个HACK
Oct 09 PHP
xajax写的留言本
Nov 25 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
php实现统计邮件大小的方法
Aug 06 PHP
php实现httpRequest的方法
Mar 13 PHP
PHP基于工厂模式实现的计算器实例
Jul 16 PHP
Laravel搭建后台登录系统步骤详解
Jul 26 PHP
PHP+Ajax异步带进度条上传文件实例
Nov 01 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
Laravel框架控制器的request与response用法示例
Sep 30 PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 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将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
PHP缓冲区用法总结
2016/02/14 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
JavaScript浮点数及运算精度调整详解
2016/10/21 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
angularJS开发注意事项
2018/05/26 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
使用Python pip怎么升级pip
2020/08/11 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
单位实习证明怎么写
2014/01/17 职场文书
《祁黄羊》教学反思
2014/04/22 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python