php实现读取超大文件的方法
通常来说在php读取大文件的时候,我们采用的方法一般是一行行来讲取,而不是一次性把文件全部写入内存中,这样会导致php程序卡死,下面就给大家介绍这样一个例子。
读取大文件最后几行数据:
<?php
/**
*取文件最后$n行
*
*@paramstring$filename文件路径
*@paramint$n最后几行
*@returnmixedfalse表示有错误,成功则返回字符串
*/
functionFileLastLines($filename,$n){
if(!$fp=fopen($filename,'r')){
echo"打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文";
returnfalse;
}
$pos=-2;
$eof="";
$str="";
while($n>0){
while($eof!="n"){
if(!fseek($fp,$pos,SEEK_END)){
$eof=fgetc($fp);
$pos–;
}else{
break;
}
}
$str.=fgets($fp);
$eof="";
$n–;
}
return$str;
}
echonl2br(FileLastLines('sss.txt',4));
/**
***取文件最后$n行*
*
*@paramstring$filename文件路径*
*@paramint$n最后几行*
*@returnmixedfalse表示有错误,成功则返回字符串
*/
functionFileLastLines($filename,$n){
if(!$fp=fopen($filename,'r')){
echo"打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文";
returnfalse;
}
$pos=-2;
$eof="";
$str="";
while($n>0){
while($eof!="n"){
if(!fseek($fp,$pos,SEEK_END)){
$eof=fgetc($fp);
$pos--;
}else{
break;
}
}
$str.=fgets($fp);
$eof="";
$n--;
}
return$str;
}
echonl2br(FileLastLines('sss.txt',4));
functiontail($fp,$n,$base=5)
{
assert($n>0);
$pos=$n+1;
$lines=array();
while(count($lines)<=$n){
try{
fseek($fp,-$pos,SEEK_END);
}
catch(Exception$e){
fseek(0);
break;
}
$pos*=$base;
while(!feof($fp)){
array_unshift($lines,fgets($fp));
}
}
returnarray_slice($lines,0,$n);
}
var_dump(tail(fopen("access.log","r+"),10));
$fp=fopen($file,"r");
$line=10;
$pos=-2;
$t="";
$data="";
while($line>0){
while($t!="n"){
fseek($fp,$pos,SEEK_END);
$t=fgetc($fp);
$pos--;
}
$t="";
$data.=fgets($fp);
$line--;
}
fclose($fp);
echo$data;
?>
读者可以根据该实例特点加以改进和完善,使之更加符合自身应用需求。