<?php
$path = __DIR__ . '/tmp/bigfile.txt';
echo getLastLines($path, 6);
/* Output:
line 9995
line 9996
line 9997
line 9998
line 9999
line 10000
*/
function getLastLines($filename, $number)
{
//尝试打开文件,如果文件不存在,则返回 false
if (!$fp = fopen($filename, 'r')) {
return false;
}
//从后向前查找,起始位置为倒数第 2 个字符
$pos = -2;
//暂存换行符,以检查指针是否在每一行的结尾
$eof = '';
//保存查找结果
$str = '';
//查找n行
while ($number > 0) {
//如果当前字符不是换行符,则继续向前查找
while ($eof != "\n") {
//从结尾开始查找
if (!fseek($fp, $pos, SEEK_END)) {
//取得当前字符
$eof = fgetc($fp);
//位置向前移动
$pos--;
} else {
//如果当前字符是换行符,则退出内循环
break;
}
}
//取出一行内容
$str = fgets($fp) . $str;
//初始化变量
$eof = '';
//继续向前查找
$number--;
}
return $str;
}
//通过php标准库中的文件处理类
// function getLastLines($filename, $number)
// {
// $file = new SplFileObject($filename);
// //移动到结尾
// $file->seek(PHP_INT_MAX);
// //结尾的key即为文件行数
// $line_num = $file->key();
// $str = '';
// while ($number > 0) {
// $file->seek($line_num - $number);
// $str .= $file->current();
// $number--;
// }
// return $str;
// }