php读取大型文本文件日志

php读取大型文本文件日志,php,Php,我有一个文本日志文件,大约600 MB 我想使用php读取它并在html页面上显示数据,但我只需要在每次运行脚本时添加的最后18行 因为它是一个大文件,所以我无法完全读取它,然后像我希望的那样翻转数组。这是他们的另一种方法吗?将该大小的文件加载到内存中可能不是一个好主意。这应该能让你摆脱困境 $file = escapeshellarg($file); $line = 'tail -n 18 '.$file; system($line); 使用fopen、filesize和fseek打开文件,

我有一个文本日志文件,大约600 MB

我想使用php读取它并在html页面上显示数据,但我只需要在每次运行脚本时添加的最后18行


因为它是一个大文件,所以我无法完全读取它,然后像我希望的那样翻转数组。这是他们的另一种方法吗?

将该大小的文件加载到内存中可能不是一个好主意。这应该能让你摆脱困境

$file = escapeshellarg($file);
$line = 'tail -n 18 '.$file;
system($line);
使用fopen、filesize和fseek打开文件,并仅在接近文件末尾时开始读取


手册页上的注释包括读取大文件最后X行的完整代码。

最好的方法是使用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);
}

您可以使用

$file = popen("tac $filename",'r');

while ($line = fgets($file)) {
  echo $line;
}

为了记录在案,他也遇到了同样的问题,并尝试了这里的所有解决方案

事实证明,Dagon的popen tac$filename方法是最快的,也是内存和CPU负载最低的方法


使用2Gb日志文件测试,每次读取500、1000和2000行。平整的谢谢。

您能执行外部命令吗?通过exec调用Linux/Unix的tail可能是最简单的方法。我有root,但理想情况下,我也想向我的用户推广它……使用Unix方式会不会有安全问题?我需要什么权限才能这样做?正常权限应该足够了。也许你需要翻一下文件。是的,我误读了他最后一句话,我以为他想要前18句。这是一个高内存消耗。。。已耗尽134217728字节的允许内存大小