PHP 5.6でデーモンを作成しています。今のところ、無限ループを持つmainLoop()
メソッドを持つ基本的にDaemon
クラスです。各繰り返しで、mainLoopは一連のステップを実行します。私はそれが「優雅なキル」メカニズムを実装する必要がPHP 5.6シグナル処理:declare(ticks = 1)vs pcntl_signal_dispatch()
:SIGINTやSIGTERMが到着した場合、デーモンが死ぬ前に、現在の反復の現在のステップを完了する必要があります。
私の考えでは、デフォルトでは静的変数Daemon::CONTINUE
TRUEを使用することです。 SIGINTまたはSIGTERMが到着すると、FALSEに設定されます。 各反復では、次のステップに進む前に、デーモンはself::CONTINUE
がFALSEに切り替えられたかどうかをチェックし、そうであれば、それを返します。
私はこれを行う方法はpcntl_signal
を使用することであることを知っています。 declare(ticks=1)
またはpcntl_signal_dispatch()
と一緒に使用することができますが、その違いについてはわかりません。
declare(ticks=1)
は、各ティック後に信号が到着するかどうかを確認しますが、pcntl_signal_dispatch()
は、コールするときにのみ信号を明示的にチェックしますか?
これは前に説明した2つの方法のスニペットです。彼らはどちらも正しいですか?どちらを使うべきですか?
ウェイ1
<?php
declare(ticks=1) {
pcntl_signal(SIGINT, function($signo) {Daemon::CONTINUE = FALSE;});
pcntl_signal(SIGTERM, function($signo) {Daemon::CONTINUE = FALSE;});
}
public class Daemon {
public static $CONTINUE = TRUE;
function mainLoop() {
...
if (self::CONTINUE === FALSE)
return;
...
}
}
ウェイあなたのサポートのための2つの
<?php
pcntl_signal(SIGINT, function($signo) {Daemon::CONTINUE = FALSE;});
pcntl_signal(SIGTERM, function($signo) {Daemon::CONTINUE = FALSE;});
public class Daemon {
public static $CONTINUE = TRUE;
function mainLoop() {
...
pcntl_signal_dispatch();
if (self::CONTINUE === FALSE)
return;
...
}
}
感謝。