Как сохранить файл до 1000 строк в Linux или PHP? - PullRequest
2 голосов
/ 14 июня 2011

У меня есть файл, который я использую для регистрации IP-адресов для клиента. Они хотят сохранить последние 500 строк файла. Это в системе Linux с PHP4 (о нет!).

Я собирался добавить в файл одну строку за раз с новыми IP-адресами. У нас нет доступа к cron, поэтому мне, вероятно, нужно, чтобы эта функция также выполняла очистку с ограничением строки.

Я думал о том, чтобы использовать как exec('tail [some params]') или, возможно, прочитать файл в PHP, разбить его на новые строки в массив, получить последние 1000 элементов и записать его обратно. Кажется, что она требует большого объема памяти.

Какой лучший способ сделать это?

Обновление:

В комментариях к @ meagar ниже, если бы я хотел использовать функциональность zip, как бы я это делал в своем PHP-скрипте? (нет доступа к cron)

if(rand(0,10) == 10){
 shell_exec("find . logfile.txt [where size > 1mb] -exec zip {} \;")
}

Будет ли zip перечислять файлы автоматически, если существует существующий файл, или мне нужно сделать это вручную?

Ответы [ 3 ]

2 голосов
/ 14 июня 2011

Logrotate

Это был бы "правильный" ответ, и его тоже нетрудно настроить.

2 голосов
/ 14 июня 2011

Вероятно, как вы и предлагали, самый быстрый способ использовать tail:

passthru("tail -n 500 $filename");

(passthru делает то же самое, что и exec, только выводит весь вывод программы на стандартный вывод. Вы можете захватить вывод, используя выходной буфер)

[править]

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

0 голосов
/ 14 июня 2011

Вы можете получить количество строк, используя count (explode ("\ n", file_get_contents ("log.txt"))) и, если оно равно 1000, получить подстроку, начиная с первой \ n до конца , добавьте новый IP-адрес и снова напишите весь файл. Это почти то же самое, что написать новый IP, открыв файл в режиме +.

...