PHP最佳方法分析access_log


php best way analysis access_log

我想分析access_log,然后将访问者ip,日期,页面浏览量或图像视图存储到mysql表中。

我打算每分钟使用cron作业调用一个php脚本,打开access_log。

但现在access_log已经超过500MB,每分钟将增加约0.4MB。(通常为 50-350 条记录)

那么如何在PHP中打开这么大的文件呢?读取最后500条记录,然后正则表达式获得最后一分钟的记录。我的服务器有 32GB RAM,内存没有问题,但我需要较低的 CPU 使用率。任何人都可以用简单的代码帮助我吗?谢谢。

编辑

接受@Jeremiah Winsley的建议,我在我的httpd.conf中使用rotatelogs。但尚未创建日志。问题出在哪里?

<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>

不要尝试重新发明轮子。始终尝试并搜索其他人可能已经开发的工具。Web服务器已经存在了很长时间,因此有大量的日志解析器和服务器工具。

试试这个PHP解析器,节省一些时间。

https://github.com/kassner/log-parser

如前所述,我不会在实时文件上执行此操作。您可能应该每 5 或 10 分钟设置一次 cronjob,并更频繁地旋转文件。并使用最近旋转的文件。但是,这可能会导致大量文件堆积。