我用PHP非常成功地使用ZeroMQ并编写了一个作业服务器.我有一个管理脚本,它检查服务器的运行状况,并执行诸如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);
}
// ..
Run Code Online (Sandbox Code Playgroud)
ZeroMQ将在关闭时尝试发送挂起的消息 - 您可以通过设置ZMQ :: SOCKOPT_LINGER套接字选项(在连接之前必须执行此操作)来控制它,这应该允许您快速终止.
看看http://api.zeromq.org/2-1:zmq-setsockopt上的ZMQ_LINGER位