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 相关文章推荐
怎样在UNIX系统下安装php3
Oct 09 PHP
逐步提升php框架的性能
Jan 10 PHP
一家之言的经验之谈php+mysql扎实个人基本功
Mar 27 PHP
php stream_get_meta_data返回值
Sep 29 PHP
什么是OneThink oneThink后台添加插件步骤
Apr 13 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
May 11 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
Dec 27 PHP
php制作圆形用户头像的实例_自定义封装类源代码
Sep 18 PHP
Yii2框架类自动加载机制实例分析
May 02 PHP
PHP类的自动加载机制实现方法分析
Jan 10 PHP
PHP PDOStatement::fetch讲解
Jan 31 PHP
yii2.0框架场景的简单使用示例
Jan 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之第一天
2006/10/09 PHP
PHP多线程类及用法实例
2014/12/03 PHP
ThinkPHP中limit()使用方法详解
2016/04/19 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
PHP实现网站应用微信登录功能详解
2019/04/11 PHP
Prototype Function对象 学习
2009/07/12 Javascript
使用JQuery进行跨域请求
2010/01/25 Javascript
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
node.js中的fs.statSync方法使用说明
2014/12/16 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
详解Nuxt.js部署及踩过的坑
2018/08/07 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
实时获取Python的print输出流方法
2019/01/07 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
Python实现SMTP邮件发送
2020/06/16 Python
浅谈python锁与死锁问题
2020/08/14 Python
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
strstr()的简单实现
2013/09/26 面试题
学雷锋活动总结报告
2014/06/26 职场文书
办理信用卡工作证明
2014/09/30 职场文书
家长意见书
2015/06/04 职场文书
2015暑假实习报告范文
2015/07/13 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书