通常来说在php读取大文件的时候,我们采用的方法一般是一行行来讲取,而不是一次性把文件全部写入内存中,这样会导致php程序卡死,下面就给大家介绍这样一个例子。
读取大文件最后几行数据:
<?php/** * 取文件最后$n行 ** @param string $filename 文件路径 * @param int $n 最后几行 * @return mixed false表示有错误,成功则返回字符串 */function FileLastLines($filename, $n){ if(!$fp = fopen($filename, "r")){echo "打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文";return false;}$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;}echo nl2br(FileLastLines("sss.txt", 4));/** * * * 取文件最后$n行 * ** @param string $filename 文件路径 * * @param int $n 最后几行 * * @return mixed false表示有错误,成功则返回字符串 */function FileLastLines($filename, $n){if(!$fp = fopen($filename, "r")){echo "打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文";return false;}$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;}echo nl2br(FileLastLines("sss . txt", 4));function tail($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));}}return array_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;?>读者可以根据该实例特点加以改进和完善,使之更加符合自身应用需求。