Прочитать последнюю строку из файла - PullRequest
30 голосов
/ 02 октября 2009

Я столкнулся с проблемой. У меня есть журнал в окне Linux, в котором записан вывод нескольких запущенных процессов. Этот файл иногда может быть очень большим, и мне нужно прочитать последнюю строку из этого файла.

Проблема в том, что это действие будет вызываться через AJAX-запрос довольно часто, и когда размер файла этого журнала превышает 5-6 МБ, это довольно плохо для сервера. Поэтому я думаю, что мне нужно прочитать последнюю строку, но не читать весь файл и проходить через него или загружать его в ОЗУ, потому что это просто загрузит до смерти мою коробку.

Есть ли какая-либо оптимизация для этой операции, чтобы она работала без сбоев и не вредила серверу или не убивала Apache?

Другой вариант, который у меня есть, - exec('tail -n 1 /path/to/log'), но он звучит не так хорошо.

Позднее редактирование: Я НЕ хочу помещать файл в ОЗУ, потому что он может стать огромным. fopen() не вариант.

Ответы [ 12 ]

0 голосов
/ 02 октября 2009

Я бы использовал file (), который читает файл в массив, переворачивает массив и получает первый элемент или извлекает массив:

$ last_line = array_pop (file ($ filename));

Если вы хотите повысить производительность, попробуйте открыть файл и использовать указатель файла для навигации по нему.

0 голосов
/ 02 октября 2009

Можно ли было бы оптимизировать это с другой стороны? Если это так, просто позвольте приложению регистрации всегда записывать строку в файл при его усечении (т. Е.> Вместо >>)

Однако некоторую оптимизацию можно достичь, «угадав», просто откройте файл, и по средней ширине строки журнала вы сможете угадать, где будет последняя строка. Перейдите в эту позицию с помощью fseek и найдите последнюю строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...