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; ?>
读者可以根据该实例特点加以改进和完善,使之更加符合自身应用需求。