从单独的并行PHP进程写入相同的日志文件

时间:2014-05-14 18:07:41

标签: php logging parallel-processing monolog

我有一个API,可以为每个请求写入日志。还有另一个后台任务一直在运行,并使用相同的记录器来记录错误等。由于此过程始终在运行并且具有对文件的引用,因此API实际上永远不会获得在那里写入的权限。

我使用monolog作为“StreamHandler”处理程序的记录器。

我的目标是从这两个进程使用相同的日志文件。我怎样才能实现它?有没有简单的方法让monolog在写完文件之后释放文件的访问锁定并在写入之前再次获得它?感谢。

2 个答案:

答案 0 :(得分:1)

我自己一直在想这个问题;令人惊讶的是,在mod_php这样的多进程环境中运行php的频率有多少显式文档存在。

最明显的解决方案是不直接利用StreamHandler,而是依赖于syslog或者排序。 PHP本身并不真正处理线程/多进程支持,但syslog(及其多种变体)在套接字上侦听,具有相对高级的路由功能,并且是线程安全的。

由于您提到您正在运行后台任务并使用相同的记录器,因此您可以扩展此后台进程以侦听套接字并负责记录来自其他进程的消息(或者,更好的是,还有其他一些后台任务(s)为此; SRP存在是有原因的。)

答案 1 :(得分:0)

不是100%准确,但请查看this SO answer

我很好奇,所以我编写了以下简单的脚本:

<强> test.php的

BA

我在Win 8.1四核机器上并行运行了8个脚本。

在第一次运行时,我遇到了罕见的问题,其中换行符char放错位置,这样你就可以在同一行上获得两个日志转储,然后是一行空行(换行符号)。

第二次运行我根本没有打嗝。

(*)请注意,单个脚本在我的机器上写入10000行,因此在每秒平均80000行(并且在第二次运行时没有得到)时会出现罕见的打嗝......非常不错。

干杯。