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 相关文章推荐
URL Rewrite的设置方法
Jan 02 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
Nov 07 PHP
php 短链接算法收集与分析
Dec 30 PHP
探讨PHP使用eAccelerator的API开发详解
Jun 09 PHP
Destoon实现多表查询示例
Aug 21 PHP
PHP-Java-Bridge使用笔记
Sep 22 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
盘点PHP和ASP.NET的10大对比!
Dec 24 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 PHP
PHP微信红包生成代码分享
Oct 06 PHP
tp5实现微信小程序多图片上传到服务器功能
Jul 16 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 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 大数据量及海量数据处理算法总结
2011/05/07 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
PHP合并discuz用户脚本的方法
2015/08/04 PHP
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
JavaScript事件详细讲解
2016/06/27 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
使用socket.io制做简易WEB聊天室
2018/01/02 Javascript
Vue实现用户自定义字段显示数据的方法
2018/08/28 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
python多线程抓取天涯帖子内容示例
2014/04/03 Python
Python中的模块和包概念介绍
2015/04/13 Python
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
python 进程 进程池 进程间通信实现解析
2019/08/23 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
Django权限控制的使用
2021/01/07 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
css3 给背景设置渐变色的方法
2019/09/12 HTML / CSS
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
体育课课后反思
2014/04/24 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
2015年体育部工作总结
2015/04/02 职场文书
Python OpenGL基本配置方式
2022/05/20 Python