2012-06-08 41 views
6

我一直使用ZeroMQ與PHP相當成功,並且寫了一個作業服務器。 我有一個管理腳本,它檢查服務器的健康狀況,並執行類似於超時檢測的內容。如何在超時後斷開ZeroMQ套接字?

當服務器啓動時,一切都很好,但是當它停止時(並且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); 
     } 
     // .. 
+0

保存我的一天!謝謝! – Franquis

回答

7

ZeroMQ會盡量提供在關閉時掛起的消息 - 您可以通過設置ZMQ :: SOCKOPT_LINGER套接字選項控制那(哪您必須在連接之前執行),這應該允許您快速終止。

看看ZMQ_LINGER位http://api.zeromq.org/2-1:zmq-setsockopt