PHP читать большой текстовый файл журнала - PullRequest
2 голосов
/ 28 января 2011

У меня есть текстовый файл журнала, около 600 МБ.

Я хочу прочитать его с помощью php и отобразить данные на html-странице, но мне нужны только последние 18 строк, которые добавлялись при каждом запуске скрипта.

Поскольку это большой файл, я не могу прочитать все это, а затем перевернуть массив, как я и надеялся. Это их другой путь?

Ответы [ 5 ]

2 голосов
/ 28 января 2011

Используйте fopen, filesize и fseek, чтобы открыть файл и начать чтение только в конце файла.

Комментарии на странице руководства fseek содержат полный код для чтения последних X строк большого файла.

1 голос
/ 28 января 2011

вы можете отправить его обратно с

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

while ($line = fgets($file)) {
  echo $line;
}
1 голос
/ 28 января 2011

Загрузка файла этого размера в память, вероятно, не будет хорошей идеей.Это должно тебя обойти.

$file = escapeshellarg($file);
$line = 'tail -n 18 '.$file;
system($line);
0 голосов
/ 26 февраля 2013

Для справки, имел ту же проблему и пробовал каждое решение здесь.

Оказывается, что открытый способ Dagon "tac $filename" является самым быстрым и с наименьшей загрузкой памяти и процессора.

Протестировано с лог-файлом 2 Гб, каждый раз читая 500, 1000 и 2000 строк. Гладкий; плавный. Спасибо.

0 голосов
/ 28 января 2011

Лучший способ сделать это - использовать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...