php读写文件比较 (fread,fwrite,file_put_contents,file_get_contents)

来源:互联网 发布:gfxbench数据库网址 编辑:程序博客网 时间:2024/05/16 05:15

今天发现一个快速开发库叫做kiwiphp,其号称达到原生php 的 60%的处理速度,于是拿来翻阅了一下代码,突然发现在php5.1以后php已提供了非常完整的文件读写函数,无需自行使用fopen,fwrite与 fread等函数,但效率是否真的比使用传统函数高呢?带着这个疑问我做了测试


$round=100;
$mtime = explode(' ', microtime());
$starttime = $mtime[1] + $mtime[0];
for($i=0;$i<$round;$i++){
   writetofile("./testwrite","1234567890");
}
$mtime = explode(' ', microtime());
$endtime = $mtime[1] + $mtime[0];
echo "write 1 in :".($endtime-$starttime)."<BR/>";

$mtime = explode(' ', microtime());
$starttime = $mtime[1] + $mtime[0];
for($i=0;$i<$round;$i++){
   writetofile("./testwriteappend","1234567890","ab+");
}
$mtime = explode(' ', microtime());
$endtime = $mtime[1] + $mtime[0];
echo "write 2 in :".($endtime-$starttime)."<BR/>";


$mtime = explode(' ', microtime());
$starttime = $mtime[1] + $mtime[0];
for($i=0;$i<$round;$i++){
   readstream("./testwriteappend",10,"rb",1024);
}
$mtime = explode(' ', microtime());
$endtime = $mtime[1] + $mtime[0];
echo "read 1 in :".($endtime-$starttime)."<BR/>";


$mtime = explode(' ', microtime());
$starttime = $mtime[1] + $mtime[0];
for($i=0;$i<$round;$i++){
   file_put_contents("./testwritef","1234567890", LOCK_EX);
}
$mtime = explode(' ', microtime());
$endtime = $mtime[1] + $mtime[0];
echo "writef 1 in :".($endtime-$starttime)."<BR/>";

$mtime = explode(' ', microtime());
$starttime = $mtime[1] + $mtime[0];
for($i=0;$i<$round;$i++){
   file_put_contents("./testwritefappend","1234567890",FILE_APPEND | LOCK_EX);
}
$mtime = explode(' ', microtime());
$endtime = $mtime[1] + $mtime[0];
echo "writef 2 in :".($endtime-$starttime)."<BR/>";

$mtime = explode(' ', microtime());
$starttime = $mtime[1] + $mtime[0];
for($i=0;$i<$round;$i++){
   file_get_contents("./testwritefappend",FILE_BINARY,NULL,10,1024);
}
$mtime = explode(' ', microtime());
$endtime = $mtime[1] + $mtime[0];
echo "readf 1 in :".($endtime-$starttime)."<BR/>";



function writetofile($filename,$data,$method="wb+"){
   //touch($filename);
   $handle=fopen($filename,$method);
   if(!$handle){
     return false;
   }
   flock($handle,LOCK_EX);
   fputs($handle,$data);
   //flock($handle,LOCK_UN);
   fclose($handle);
   return true;
}
function readstream($filename,$seek=0,$method="rb",$toread=1024){
   if($handle=fopen($filename,$method)){
     $seek>0 && fseek($handle,$seek);//,SEEK_CUR);
     //flock($handle,LOCK_SH);
     $size=filesize($filename);
     if($size){
       $size= $size>$toread ? $toread : $size;
       $filedata =fread($handle,$size);
     }else{
       while(!feof($handle)){
         $filedata .=fread($handle,1024);
         if(strlen($filedata)>=$toread)
           break;
       }
     }
     //flock($handle,LOCK_UN);
     fclose($handle);
   }
   return $filedata;
}


经过反复运行这组函数,我发现其实,php5提供的整合函数并不占多大优势,传统方式偶尔会快过php5提供的整合函数。

其中一组结果

引用

write 1 in :0.0020349025726318
write 2 in :0.0018160343170166
read 1 in :0.00025391578674316
writef 1 in :0.0017929077148438
writef 2 in :0.0018231868743896
readf 1 in :0.00019192695617676


实际上也就快那么0.001,0.0001秒左右。看来php自身的fread,fopen等函数已经非常优秀,即使与C相比也不会相差多少(php5提供的整合函数实际上就是将fopen,fread等过程较由php自身也就是c编写的函数来完成)。
不过减少了很多手工需要些的代码,实在是不错的选择:)