2012-06-08 40 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