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 中执行排序与 MySQL 中排序
Apr 21 PHP
php is_file 判断给定文件名是否为一个正常的文件
May 10 PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
Oct 23 PHP
PHP将进程作为守护进程的方法
Mar 19 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 PHP
thinkphp3.x中session方法的用法分析
May 20 PHP
浅谈php处理后端&amp;接口访问超时的解决方法
Oct 29 PHP
PHP设计模式之适配器模式定义与用法详解
Apr 03 PHP
PHP7基于curl实现的上传图片功能
May 11 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
Aug 07 PHP
php+Ajax处理xml与json格式数据的方法示例
Mar 04 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函数的方法
2013/11/13 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
[04:29]【TI9采访】OG.N0tail在胜者组决赛后接受采访
2019/08/25 DOTA
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
简单了解python模块概念
2018/01/11 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
销售主管岗位职责
2014/02/08 职场文书
《商鞅南门立木》教学反思
2014/02/16 职场文书
商业房地产广告语
2014/03/13 职场文书
幼师小班个人总结
2015/02/12 职场文书
简爱电影观后感
2015/06/10 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
总结Java对象被序列化的两种方法
2021/06/30 Java/Android