2012-06-08 28 views
6

私はZeroMQをPHPでうまく使い、ジョブサーバーを書いています。 私は、サーバーの健全性をチェックし、タイムアウトでpingを実行するような管理スクリプトを持っています。タイムアウト後にZeroMQソケットを切断する方法は?

サーバーが稼働しているときにすべてがうまく動作しますが、ダウンしたときには(期待通りにZMQPollがタイムアウトします)、スクリプトが想定しているとおりの処理を行いますが、スクリプトは終了しません。

私は、すべてのソケット変数などをクリーンアップしたりアンセットアップしたりしましたが、exit()というPHPスクリプトもハングします。

ソケットdisconnect()メソッドが存在しないようですので、ソケットが死んでいるとPHPに知らせるにはどうすればいいですか?

これは私のadminスクリプトから以下のコードの抜粋である -

 // ... 
     // 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); 
     } 
     // .. 
+0

上ZMQ_LINGERビットを見てみましょう!ありがとう! – Franquis

答えて

7

ZeroMQはそれがシャットダウンしたときにメッセージを保留しようとしてお届けします - あなたはZMQを設定することで、これを制御することができます:: SOCKOPT_LINGERソケットオプション(接続する前にを実行してください。)これにより、すぐに終了することができます。

は私の一日保存http://api.zeromq.org/2-1:zmq-setsockopt

関連する問題