今天发现一个快速开发库叫做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编写的函数来完成)。
不过减少了很多手工需要些的代码,实在是不错的选择:)