当前位置: 首页 > 图文教程 > 网络编程 > PHP > php 多线程上下文中安全写文件实现代码

PHP
php SQL之where语句生成器
php 随机生成10位字符代码
PHP获取类中常量,属性,及方法列表的方法
php 动态执行带有参数的类方法
php pcntl_fork和pcntl_fork 的用法
PHP Document 代码注释规范
php error_log 函数的使用
PHP 加密与解密的斗争
对squid中refresh_pattern的一些理解和建议
一个php导出oracle库的php代码
PHP 中执行排序与 MySQL 中排序
php 保留小数点
将数组写入txt文件 var_export
php反弹shell实现代码
PHP 危险函数解释 分析
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
Uchome1.2 1.5 代码学习 common.php
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
php mssql 分页SQL语句优化 持续影响
PHP mb_convert_encoding 获取字符串编码类型实现代码

PHP 中的 php 多线程上下文中安全写文件实现代码


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 160 ::
收藏到网摘: n/a

提供一个php多线程上下文中安全写文件的实现方法。这个实现没有使用php 的file lock机制,使用的是临时文件机制。多线程中的各个线程都是对各自(每个线程独占一个)的临时文件写,然后再同步到原文件中。
复制代码 代码如下:

<?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;
}
?>