2017-10-08 34 views
0

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; 
     ... 
    } 
} 

感謝。

答えて

0

いくつかのテストとデバッグの後、私は両方のソリューションを試しました。 誰かが私の同じ問題に遭遇した場合のために私はここに私の観察を残します。

declare(ticks = 1)のあるウェイ1が動作しないようです。なぜ私は理解できません。 pcntl_signal_dispatchと2
方法()、逆に、すてきな動作しているようです。

深い研究の後、とにかく2の方が私の場合にとって最良の方法だと思います。
実際には、各コード行の実行にほぼ対応する各ティックでpcntl_signalを実行すると宣言(tick = 1)します。 これは、パフォーマンスを低下させる可能性があります。逆に

、どうやらpcntl_signal_dispatch)ちょうどそれがパフォーマンスに軽量化する必要がありますので、それは、呼び出されたときに信号を保留扱い。

関連する問題