大文件只能用fread()一行行读,直接file()会内存不足,php.ini memory_limit默认是128m内存
<?php
/**
* 取文件最后$n行
* @param string $file 文件路径
* @param int $line 最后几行
* @return mixed 成功则返回字符串
*/
function getLastLines($file,$line=1){
if(!$fp=fopen($file,'r')){
echo "打开文件失败";
return false;
}
$pos = -2; //偏移量
$eof = " "; //行尾标识
$data = "";
while ($line > 0){//逐行遍历
while ($eof != "\n"){ //不是行尾
fseek($fp, $pos, SEEK_END);//fseek成功返回0,失败返回-1
$eof = fgetc($fp);//读取一个字符并赋给行尾标识
$pos--;//向前偏移
}
$eof = " ";
$data .= fgets($fp);//读取一行
$line--;
}
fclose($fp);
return $data;
}
//测试
print_r(getLastLines("access.log",5));exit;
如果是linux服务器,还可以使用tail来进行
<?php
function getLastLines($file,$line=1){
$file = escapeshellarg($file); // 对命令行参数进行安全转义
$line = `tail -n $line $file`;
return $line;
}
//测试
print_r(getLastLines("down.php",5));exit;