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 相关文章推荐
PHP4实际应用经验篇(1)
Oct 09 PHP
mysql5详细安装教程
Jan 15 PHP
php 分页原理详解
Aug 21 PHP
解析如何去掉CodeIgniter URL中的index.php
Jun 25 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
使用配置类定义Codeigniter全局变量
Jun 12 PHP
取得单条网站评论以数组形式进行输出
Jul 28 PHP
推荐10个提供免费PHP脚本下载的网站
Dec 31 PHP
php采用session实现防止页面重复刷新
Dec 24 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP设计模式之装饰器模式定义与用法详解
Apr 02 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
Oct 30 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递归列出所有文件和目录的代码
2008/09/10 PHP
Chrome Web App开发小结
2014/09/04 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
php图片添加水印例子
2016/07/20 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
Vue父组件如何获取子组件中的变量
2019/07/24 Javascript
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
Python continue语句用法实例
2014/03/11 Python
python django集成cas验证系统
2014/07/14 Python
python套接字流重定向实例汇总
2016/03/03 Python
python Django批量导入不重复数据
2016/03/25 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
大学生毕业自我鉴定
2013/11/06 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
小学数学国培感言
2014/03/10 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
学风建设演讲稿
2014/09/12 职场文书
琅琊山导游词
2015/02/05 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
在JavaScript中如何使用宏详解
2021/05/06 Javascript
SQL Server实现分页方法介绍
2022/03/16 SQL Server