6

私は、ZeroMQ を PHP でかなりうまく使用しており、ジョブ サーバーを作成しました。サーバーの状態をチェックし、タイムアウトでpingを実行するなどの管理スクリプトがあります。

サーバーが稼働している場合はすべてうまく機能しますが、サーバーが停止している場合 (およびZMQPoll予想どおりにタイムアウトした場合)、スクリプトは想定どおりに動作しますが、スクリプトが終了することはありません。

すべてのソケット変数などをクリーンアップして設定解除しようとしましたがexit()、PHPスクリプトを呼び出してもハングします。

ソケット メソッドがないように見えますがdisconnect()、ソケットが停止していてハングしたくないことを PHP に伝えるにはどうすればよいでしょうか。

これは、私の管理スクリプトからの以下のコードのスニペットです -

        // ...
        // waiting for dead server on zmqsock to respond after sending a message
        // 
        $poll = new ZMQPoll;
        $poll->add( $this->zmqsock, ZMQ::POLL_IN );
        $readable = $writeable = array();
        $poll->poll( $readable, $writeable, $timeout * 1000 );
        if( $errors = $poll->getLastErrors() ) {
            foreach ( $errors as $err ) {
                throw new Exception($err);
            }
        }
        if( ! $readable ){
             // clean up everything, raise errors, etc..
             $poll->clear();
             unset( $poll, $this->zmqsock, $this->zmqcontext );
             // Script hangs here
             exit(0);
        }
        // ..
4

1 に答える 1

7

ZeroMQは、シャットダウン時に保留中のメッセージを配信しようとします。これは、ZMQ :: SOCKOPT_LINGERソケットオプション(接続する前に実行する必要があります)を設定することで制御できます。これにより、すばやく終了できます。

http://api.zeromq.org/2-1:zmq-setsockoptのZMQ_LINGERビットを見てください

于 2012-06-08T11:57:55.010 に答える