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 相关文章推荐
文章推荐系统(二)
Oct 09 PHP
社区(php&amp;&amp;mysql)一
Oct 09 PHP
discuz Passport 通行证 整合笔记
Jun 30 PHP
php抓取页面与代码解析 推荐
Jul 23 PHP
php中使用session防止用户非法登录后台的方法
Jan 27 PHP
php实现根据词频生成tag云的方法
Apr 17 PHP
php用户注册信息验证正则表达式
Nov 12 PHP
php数组指针操作详解
Feb 14 PHP
PHP中phar包的使用教程
Jun 14 PHP
PHP错误处理函数register_shutdown_function使用示例
Jul 03 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
CI框架网页缓存简单用法分析
Dec 26 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
PHP Ajax中文乱码问题解决方法
2009/02/27 PHP
php session 预定义数组
2009/03/16 PHP
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
2013/12/30 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
jQuery插件EasyUI获取当前Tab中iframe窗体对象的方法
2016/08/05 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
Python with用法实例
2015/04/14 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
Django中间件实现拦截器的方法
2018/06/01 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
python3爬虫中异步协程的用法
2020/07/10 Python
python3实现飞机大战
2020/11/29 Python
南京软件公司的.net程序员笔试题
2014/08/31 面试题
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android