【问题标题】:Write To Same log File From Seperate Parallel PHP Processes从单独的并行 PHP 进程写入相同的日志文件
【发布时间】:2014-07-02 22:34:20
【问题描述】:

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

我将monolog 用作带有“StreamHandler”处理程序的记录器。

我的目标是在两个进程中使用相同的日志文件。我怎样才能实现它?有没有什么简单的方法可以用独白在写完东西后释放文件的访问锁并在写之前再次获得它?谢谢。

【问题讨论】:

  • 您真的不希望两个单独的进程写入同一个文件。要么他们不断开/锁/写/释放/关闭,要么有一些外部协调的方法,他们会踩着对方的脚趾。
  • 那么,您认为哪种解决方案最好?双方都制作相似员工的日志,这就是为什么我想使用相同的日志文件。

标签: php logging parallel-processing monolog


【解决方案1】:

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

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

test.php

require_once __DIR__ . '/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger( 'Test' . `tasklist | grep php | wc -l` );
$log->pushHandler(new StreamHandler(__DIR__ . '/file.log', Logger::DEBUG));

while ( true ) {
    $log->debug( "This is a single log line" );
}

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

第一次运行我遇到了罕见的打嗝,换行符会被放错位置,这样你会在同一行得到两个日志转储,然后一个空行(换行符)。

第二次运行我完全没有打嗝。

(*) 请注意,单个脚本在我的机器上写入了 10000 行,因此在平均每秒 80000 行的情况下出现罕见的打嗝(并且在第二次运行时没有出现任何问题)......相当不错。

干杯。

【讨论】:

    【解决方案2】:

    我自己也一直在想这个;考虑到 php 在像 mod_php 这样的多进程环境中运行的频率,令人惊讶的是那里没有多少明确的文档。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      相关资源
      最近更新 更多