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 相关文章推荐
PHPlet在Windows下的安装
Oct 09 PHP
php 过滤危险html代码
Jun 29 PHP
ubuntu 编译安装php 5.3.3+memcache的方法
Aug 05 PHP
php获取mysql数据库中的所有表名的代码
Apr 23 PHP
php中计算程序运行时间的类代码
Nov 03 PHP
基于PHP异步执行的常用方式详解
Jun 03 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
Jun 08 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
Laravel5.7 Eloquent ORM快速入门详解
Apr 12 PHP
php设计模式之策略模式应用案例详解
Jun 17 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 PHP
PHP number_format函数原理及实例解析
Jul 14 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中使用与Perl兼容的正则表达式
2006/11/26 PHP
php一些公用函数的集合
2008/03/27 PHP
一个比较简单的PHP 分页分组类
2009/12/10 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
如何使用PHP对网站验证码进行破解
2015/09/17 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
jQuery+AJAX实现网页无刷新上传
2015/02/22 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
Vue axios 跨域请求无法带上cookie的解决
2020/09/08 Javascript
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
简化Python的Django框架代码的一些示例
2015/04/20 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
毕业生文员求职信
2013/11/03 职场文书
房地产财务管理制度
2014/02/02 职场文书
幼儿园标语大全
2014/06/19 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
西游降魔篇观后感
2015/06/15 职场文书
亲戚关系证明
2015/06/24 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
浅谈Python响应式类库RxPy
2021/06/14 Python
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL