У меня есть текстовый файл журнала, около 600 МБ.
Я хочу прочитать его с помощью php и отобразить данные на html-странице, но мне нужны только последние 18 строк, которые были добавлены каждый раз при запуске скрипта.
Поскольку это большой файл, я не могу его прочитать, а затем перевернуть массив, как я бы надеялся. Это их другой путь?
Используйте fopen
, filesize
и fseek
чтобы открыть файл и начать читать его только в конце файла.
Комментарии на странице руководства fseek
включают полный код для чтения последних X строк большого файла.
вы можете перебросить его назад
$file = popen("tac $filename",'r'); while ($line = fgets($file)) { echo $line; }
Загрузка этого файла размера в память, вероятно, не была бы хорошей идеей. Это должно помочь вам в этом.
$file = escapeshellarg($file); $line = 'tail -n 18 '.$file; system($line);
Лучший способ сделать это – использовать 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); }
Для записи была та же проблема и каждый раз пробовал каждое решение.
Оказывается, что путь Dagon по умолчанию «tac $ filename» является самым быстрым, а самый низкий – с самой низкой памятью и загрузкой процессора.
Протестировано с журналом журнала 2Gb, который считывает 500, 1000 и 2000 строк каждый раз. Гладкий; плавный. Спасибо.