我有一个文本日志文件,大约600 MB。
我想用php阅读它并在html页面上显示数据,但我只需要每次运行脚本时添加的最后18行。
由于它是一个大文件,我无法读取所有内容然后翻转数组,正如我所希望的那样。他们是另一种方式吗?
答案 0 :(得分:2)
使用fopen
,filesize
和fseek
打开文件,然后只在文件末尾附近开始阅读。
fseek
手册页上的评论包括读取大文件最后X行的完整代码。
答案 1 :(得分:1)
将该大小文件加载到内存中可能不是一个好主意。这应该可以解决这个问题。
$file = escapeshellarg($file);
$line = 'tail -n 18 '.$file;
system($line);
答案 2 :(得分:1)
您可以使用
向后流式传输$file = popen("tac $filename",'r');
while ($line = fgets($file)) {
echo $line;
}
答案 3 :(得分:0)
执行此操作的最佳方法是使用fread和fgets逐行读取,这非常快,因为一次只读取一行而不是while文件:
使用示例如下:
$handle = fopen("/logs/log.txt", "r")
if ($handle)
{
fseek($handle,-18,SEEK_END); //Seek to the end minus 18 lines
while (!feof($handle))
{
echo fgets($handle, 4096); //Make sure your line is less that 4096, otherwise update
$line++;
}
fclose($handle);
}
答案 4 :(得分:0)
为了记录,遇到了同样的问题并尝试了解决方案。
原来Dagon的popen“tac $filename
”方式是最快的,也是内存和CPU负载最低的方式。
使用2Gb日志文件进行测试,每次读取500,1000和2000行。平滑。谢谢。