Я хочу, чтобы анализ access_log, а затем сохранить ip посетителей, дату, просмотр страницы или изображения в таблицу MySQL.
Я планирую использовать cron job, вызывать php-скрипт каждую минуту, открыть access_log.
Но теперь access_log
имеет уже более 500 МБ, и он будет увеличиваться примерно на 0,4 МБ в минуту. (обычно 50-350 записей)
так как открыть такой большой файл в php? прочитайте последние 500 записей, затем regex получите записи за последнюю минуту. Мой сервер имеет 32 ГБ ОЗУ, память не проблема, но мне нужно меньше процессора. Кто-нибудь может помочь мне с простым кодом? Благодарю.
редактировать
примите совет @Jeremiah Winsley, я использую rotatelogs в моем httpd.conf. Но журнал не был создан. в чем проблема?
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" com bined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined env=!dontlog
CustomLog "|sbin/rotatelogs -f logs/my_log 60" combined env=!dontlog
#create a my_log every 1 minute.
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
SetEnvIf Remote_Addr "::1" dontlog
</IfModule>
Не пытайтесь заново изобрести колесо. Всегда старайтесь искать инструменты, разработанные другими. Веб-серверы существуют уже давно, поэтому существует множество синтаксических анализаторов и серверных инструментов.
Дайте этому парсеру PHP попробовать и сэкономьте время.
https://github.com/kassner/log-parser
Как уже отмечалось, я не буду делать это на живых файлах. Вам, вероятно, следует настроить cronjob примерно на каждые 5 или 10 минут и чаще вращать файлы. И используйте недавно повернутый файл. Однако это может привести к созданию большого количества файлов.
Других решений пока нет …