4

キューを調べ、ワーカージョブを受け取り、それを処理するためにワーカーを生成するPHPデーモンを実行しています。作業者自身が先に進む前に特定の場所のロックを取得します。

nohupバックグラウンドプロセスとしてデーモンを生成します。

このアーキテクチャ全体は、何らかの理由でプロセスを強制終了する必要がある場合を除いて、機能しているようです。-9を使用してそれらを殺した場合、それをワーカープロセスにトラップし、死ぬ前にロックを解除する方法はありません。

-9未満のもの(TERMやHUPなど)を使用する場合、デーモンまたはワーカープロセスのいずれにも受信されていないようです。

誰かがこの問題をより良い方法で解決しましたか?

(ps:ところで、他の考慮事項により、実装言語を変更できない場合があるため、PHPベースのソリューションのみを検討してください)

4

3 に答える 3

3

私も一度関連する問題がありました。説明させてください。ダウンローダーのように機能するphp「デーモン」がありました。定期的にフィードにアクセスし、ネットからコンテンツをダウンロード(laaaarge)します。デーモンは特定の時間に停止する必要がありました。たとえば、日中に帯域幅全体を使用しないようにするために、午前0500としましょう。cronjobを使用して、0500のデーモンにSIGTERMを送信することにしました。

デーモンには、次のコードがあります。

pcntl_signal(SIGTERM, array($this, 'signal_handler'));

signal_handlerこのように見えた場所:

public function signal_handler($signal) {
    // some cleanup code 
    exit(1);
}

残念ながら、これは機能しませんでした:|

何が起こっているのかを知るのに時間がかかりました。私が最初に理解したのは、pcntl_signal_dispatch() シグナルディスパッチを有効にするには、initでメソッドを呼び出す必要があるということでした。ドキュメントからの引用(コメント):

PHPをCLIおよび「デーモン」として(つまりループ内で)実行している場合は、この関数を各ループで呼び出して、新しいシグナルがディスパッチを待機しているかどうかを確認する必要があります。

さて、これまでのところ、それは機能しているように見えました。しかし、特定の条件下では、これでも期待どおりに機能しないことにすぐに気付きました。以前のように、デーモンはkill -9-によってのみ停止できる場合がありました。:|

では、何が問題なのですか?..回答:私のプログラムはwget、を介してファイルをダウンロードするために呼び出されましたshell_exec。問題は、shell_exec()子プロセスが終了するまでブロッキングが待機することです。このブロッキング待機中は信号処理は行われず、プロセスはSIGKILLを使用してのみ終了できます。これは難しいことです。また、子プロセスは、父親を殺した後にゾンビプロセスになったため、1つずつ終了する必要があるという問題もありました。

これに対する私の解決策は、非ブロッキングIOの出力でのproc_open()使用とを使用して子プロセスを実行することでした。stream_select()

今ではそれは魅力のように機能します。:)さらに情報が必要な場合は、コメントをドロップすることを躊躇しないでください。


PHP<5.3を使用している場合は、`を使用する必要があります

declare(ticks=1);

の代わりにpcntl_signal_dispatch()。そのためのドキュメントを参照できますpcntl_signal()。ただし、可能であれば、PHP>=5.3にアップグレードする必要があります

于 2013-03-08T16:50:15.950 に答える
1

ティックを追加するだけで問題は解決しました。

// tick use required as of PHP 4.3.0
declare(ticks = 1);

これをそのままにしておくと、コードが機能しなくなりました。

*(pcntl_signalのドキュメントに、注意を引く方法でそれが記載されていないのは残念です。)*

于 2013-03-15T06:27:01.833 に答える
0

信号をキャッチする必要があります(SIGTERM)。これは、関数pcntl_signalを介して実現できます。これにより、exitを呼び出す前に必要な機能を実行するオプションが提供されます。

于 2013-03-08T03:38:49.657 に答える