可道云是一款非常强大的私有云和在线文档管理系统,源码之中有很多借鉴的方法
安全读取文件,避免并发下读取数据为空
function file_read_safe($file,$timeout = 0.1){
clearstatcache();
if(!$file || !file_exists($file)) return false;
$start_time = microtime(true);
$index = 0;
do{
clearstatcache();
$index++;
$file_size = filesize($file);
$result = @file_get_contents($file);
if( $result === false ||
!file_exists($file) ||
strlen($result) !== $file_size){
usleep(round(rand(0,1000)*50));//0.01~10ms
}else{
return $result;
}
}while($index<=100 && (microtime(true)-$start_time) < $timeout );
return false;
}
安全写入文件,避免并发下产生的影响
function file_wirte_safe($file,$buffer,$timeout=0.1){
clearstatcache();
$fileTemp = $file.'.'.time().rand_string(5);
if(!$fp = fopen($fileTemp, "w")){
@unlink($fileTemp);
return false;
}
fwrite($fp, $buffer);
fclose($fp);
$file_lock = $file.'.lock';
$start_time = microtime(true);
$index = 0;
do{
clearstatcache();
$index++;
if(!file_exists($file_lock)){
@rename($file,$file_lock);
}
$result = @rename($fileTemp,$file);
if( $result === false || file_exists($fileTemp)){
usleep(round(rand(0,1000)*10));//0.01~10ms
}else{
@unlink($file_lock);
return true;
}
}while($index<=100 && (microtime(true)-$start_time)<$timeout );
return false;
}
原创文章,作者:witersen,如若转载,请注明出处:https://www.witersen.com