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代码简化
Feb 08 PHP
php 上一篇,下一篇文章实现代码与原理说明
May 09 PHP
PHP设计模式 注册表模式(多个类的注册)
Feb 05 PHP
深入PHP许愿墙模块功能分析
Jun 25 PHP
php 读取文件头判断文件类型的实现代码
Aug 05 PHP
如何使用php输出时间格式
Aug 31 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
Oct 25 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
Aug 28 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
Nov 05 PHP
CI框架使用composer安装的依赖包步骤与方法分析
Nov 21 PHP
PHP配置ZendOpcache插件加速
Feb 14 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 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
模拟OICQ的实现思路和核心程序(一)
2006/10/09 PHP
PHP number_format() 函数定义和用法
2012/06/01 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
JavaScript实现简单验证码
2020/08/24 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
用python删除java文件头上版权信息的方法
2014/07/31 Python
Python发送email的3种方法
2015/04/28 Python
通过数据库对Django进行删除字段和删除模型的操作
2015/07/21 Python
Django框架模板的使用方法示例
2019/05/25 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
python中对_init_的理解及实例解析
2019/10/11 Python
解决django接口无法通过ip进行访问的问题
2020/03/27 Python
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
不假外出检讨书
2014/01/27 职场文书
董事长秘书职责
2014/01/31 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python
手把手教你导入Go语言第三方库
2021/08/04 Golang
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android