3

syslog-ng(経由で)フックするPHPプログラムを作成しましたが、syslog-ng.conf基本的には次のとおりです。

while (!feof(STDIN)) {
    $input = fgets(STDIN);
    process($input);
}
cleanup();

whereprocess()cleanup()は私が定義したものです。

私が直面している問題は、cleanup(2)呼び出されないことであり、プログラムが終了する前に実行する必要があります。

SIGTERM、SIGHUP、および SIGPIPE を使用してキャッチしようとしましpcntl_signal()たが、アプリケーションのその部分は正常に動作しているようです (PHP プロセスで kill -1 を使用すると、シグナル ハンドラーが呼び出されて実行されますcleanup())。これらのメッセージを syslog-ng から取得します。

ストリームがブロックされているため、PHP がシグナルハンドラーを呼び出さないと考えて、STDIN を非ブロックに設定しようとしました。それもうまくいきませんでした。私のシグナルハンドラは呼び出されませんでした。

syslog-ng がアプリケーションを停止しようとしていることをどのように知ることができるので、クリーンアップを行うことができますか?

ありがとう、トム

更新: 1 から 31 までのすべてのシグナルをキャッチしようとしましたが、syslog-ng を再起動しても (または SIGTERM で強制終了しても) 何も受信しません。

4

5 に答える 5

4

おそらく、次のようにcleanup()PHPシャットダウン関数として登録してみてください。

function cleanup(){}
register_shutdown_function("cleanup");

理論的には、これにより php は終了する前に関数を実行します。ただし、これは強制停止オプション (kill など) と一緒に使用すると機能しない可能性があるため、(さらに別の) 暗闇で撮影されます。

でもうまくいくものを見つけてくれることを願っています。私も結果を知りたいです。

編集:これがうまくいったことをうれしく思います!

于 2009-11-05T05:11:35.900 に答える
0

これは暗闇でのショットですが、次のようにループを書き直してみてください。

do {
   $input = fgets(STDIN);
   process( $input );
while ( !feof( STDIN ) ) {
cleanup();

syslog-ng が stdout を閉じると (そうすると仮定しますか?)、fgets は読み取りを試み、実際に EOF に達するという考えです。

于 2009-11-04T02:27:30.230 に答える
0

適切なクリーンアップを行わずに PHP スクリプトが突然終了するのは、おそらく実行時エラーが発生したためです (たとえば、プロセスが EOF に達したときに fgets() によって返された空の文字列を処理する準備ができていないなど)。

PHP エラー ログを有効にして、何が起こるかを確認します。

于 2009-11-06T00:00:19.753 に答える
0

これをトラブルシューティングするために試すことができるいくつかのことを考えることができます。

1) PHP のset_error_handler() 関数を利用します。

2) 上記のコードを try/catch 構造に配置して、スローされる可能性のある例外を試行してキャッチします。

3) そのスクリプトを実行するときは、出力と標準エラーの両方をキャプチャしていることを確認してください。コマンドラインを次のように変更します。

/path/to/script 2>&1 >> /path/to/logfile.txt

...エラーをキャッチするのに役立ちます。

最後に、実際に PHP がシグナルをキャッチできない場合は、trap コマンドを使用してシェル スクリプトを使用してこれを行う必要があります。何かのようなもの:

#!/bin/sh
#
# This gets run when the script is hit with a signal
#
trap /path/to/script --cleanup
#
# Run our script
#
/path/to/script 2>&1 >> /path/to/logfile.txt

cleanup() が必要とする特定のデータがスクリプトにある場合は、データをシリアル化し、クリーンアップ スクリプトが読み取れるようにディスクに書き込む方法を確認する必要があります。

幸運を!

于 2009-11-08T02:50:25.793 に答える
0

PHP はシグナルを慎重に処理しますか? より制御しやすい別の言語でプロトタイプを作成してみてください。

于 2009-11-08T02:55:18.467 に答える