第一种:利用fseek函数
//参数传入文件路径$file和读取行数$lines(末尾倒数)
function read_file($file, $lines)
{
$handle = fopen($file, "r+");
$linecounter = $lines;
//$pos = cache('pos'.$file);
if(empty($pos)){
$pos = -2;
}
$beginning = false;
$text = array();
while ($linecounter > 0) {
$t = " ";
while ($t != "\n") {
if(fseek($handle, $pos, SEEK_END) == -1) {
$beginning = true; break;
}
$t = fgetc($handle);
$pos --;
}
$linecounter --;
if($beginning) rewind($handle);
$text[$lines-$linecounter-1] = fgets($handle);
if($beginning) break;
}
//cache('pos'.$file,$pos);
fclose ($handle);
return array_reverse($text);
}
第二种:利用linux命令行函数tail
function tail_log($filename,$n)
{
$err_msg = "对应日志文件不存在!";
if(!file_exists($filename)){
throw new Exception($err_msg);
}
$cmd = <<<EOF
tail -n $n $filename
EOF;
$cmd = escapeshellcmd($cmd);
try{
@exec($cmd,$res);
}catch (\Exception $e){
return $e->getMessage();
}
return $res;
}