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.ini中文版(1)
Oct 09 PHP
php SQL之where语句生成器
Mar 24 PHP
PHP日期时间函数的高级应用技巧
May 16 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
探讨:如何编写PHP扩展
Jun 13 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
May 19 PHP
PHP Opcache安装和配置方法介绍
May 28 PHP
关于PHP中字符串与多进制转换函数的实例代码
Nov 03 PHP
Zend Framework入门教程之Zend_Session会话操作详解
Dec 08 PHP
php-fpm开启状态统计的方法详解
Jun 23 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
PHP扩展安装方法步骤解析
Nov 24 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/07/08 PHP
PHP实现合并discuz用户
2015/08/05 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
2020/10/28 PHP
浅谈页面装载js及性能分析方法
2014/12/09 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
Python中elasticsearch插入和更新数据的实现方法
2018/04/01 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
Python flask框架端口失效解决方案
2020/06/04 Python
pandas apply多线程实现代码
2020/08/17 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
html5 datalist标签使用示例(自动完成组件)
2014/05/04 HTML / CSS
HTML5实现无刷新修改URL的方法
2019/11/14 HTML / CSS
美国羊皮公司:Overland
2018/01/15 全球购物
新电JAVA笔试题目
2014/08/31 面试题
法律工作求职自荐信
2013/10/31 职场文书
高中军训感言1000字
2014/03/01 职场文书
安全生产承诺书
2014/03/26 职场文书
日化店促销方案
2014/03/26 职场文书
职务聘任书范文
2014/03/29 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
大学生职业生涯十年规划书范文
2014/09/17 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
死亡诗社观后感
2015/06/05 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL