2

すべてのリクエストのログを書き込む API があります。常に実行されている別のバックグラウンド タスクもあり、エラーのログ記録などに同じロガーを使用します。このプロセスは常に実行されており、ファイルへの参照があるため、API は実際にはそこに書き込む権限を取得しません。

「StreamHandler」ハンドラーでロガーとして monolog を使用しています。

私の目標は、両方のプロセスからこの同じログ ファイルを使用することです。どうすれば達成できますか?何かを書き込んだ後にファイルのアクセスロックを解放し、書き込む直前に再び取得する簡単な方法はありますか? ありがとう。

4

2 に答える 2

1

私自身、これについて疑問に思っていました。mod_php のようなマルチプロセス環境で php が頻繁に実行されることを考えると、明示的なドキュメントがほとんどないことは驚くべきことです。

最も明白な解決策は、StreamHandler を直接利用せず、代わりに syslog やソートに依存することです。PHP 自体は実際にはスレッド化/マルチプロセス サポートを処理しませんが、syslog (およびその複数の亜種) はソケットをリッスンし、比較的高度なルーティング機能を備え、スレッドセーフです。

バックグラウンド タスクが実行されていて同じロガーを使用していると述べたので、おそらくこのバックグラウンド プロセスを拡張してソケットをリッスンし、他のプロセスからのメッセージをログに記録する責任を負うことができます (または、他のバックグラウンド タスクを使用することをお勧めします)。このため; SRP には理由があります)。

于 2015-01-06T20:39:17.933 に答える
0

100% 正確ではありませんが、この 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 Quad-Core マシンで 8 つのスクリプトを並行して実行しました。

最初の実行で、改行文字が間違って配置されるというまれな問題が発生しました。同じ行に 2 つのログ ダンプが表示され、その後に空白行 (改行文字) が表示されます。

2回目の実行では、しゃっくりはまったく発生しませんでした。

(*) 1 つのスクリプトが私のマシンに 10000 行を書き込むことに注意してください。そのため、毎秒平均 80000 行でまれに問題が発生する (そして 2 回目の実行で何も発生しない) ことは... かなり悪くありません。

乾杯。

于 2015-07-19T21:32:22.440 に答える