【发布时间】:2011-05-27 02:57:39
【问题描述】:
我需要将统计数据写入实时 Apache access_log 文件(我有另一个进程计算 access_log 文件中的特定行,它会定期向另一个进程报告)。
目前我只是通过在 php 中执行以下操作来强制进入 access_log 文件:
file("http://127.0.0.1/logme.php?stuff_that_I_can_watch_here");
logme.php 什么都不做,返回空并返回 200 成功。
上述技术的问题在于,对于 Apache 服务器的每个请求,都会产生另一个请求来写入日志 - 因此所需的 Apache 服务器会增加一倍。
当服务器堆积起来时,对 Apache 服务器的简单且通常快速的本地调用需要 5 秒以上。
我是否可以直接写入 access_log 文件而不引起问题,或者甚至有没有办法使用类似于 syslog() 或 error_log() 的 php 写入 apache_log 文件?
【问题讨论】:
-
这闻起来是糟糕的设计。为什么要在访问日志中记录不是真正访问的内容?为这些事情使用专用日志文件不是更好吗?
-
最初的统计数据是从 Apache 日志文件中近乎实时地收集的。随着我们项目的增长,需要更多的统计数据,并且是有条件的。例如,虽然页面加载会像往常一样在 access_log 中放置一个简单的条目,但有时在某些情况下会发生一些事情,只有这样才需要记录。有一个进程“监听”access_log 文件中的信号,并将此信息发送到外部服务器。处理多个日志文件可能会变得非常混乱。
-
@Chris 这可能以某种方式可能 - 如果 PHP 作为 Apache 模块运行,则似乎可以将错误记录到
error_log例如 - 但使用的是完全不使用的单独日志文件问题?听起来这样会容易得多。 (更新:啊,你扩展了你的评论回答我的问题) -
我想我通过解释情况使事情复杂化了。问题真的是“直接写入 access_log 是否可以 - 或者有没有一种简单的方法可以使用 php 达到相同的效果”?
-
很公平。嗯,也许
virtual()可能比显式请求更快? php.net/manual/en/function.virtual.php 我不知道这些电话是否会被记录