如何在超时后断开ZeroMQ套接字?

时间:2012-06-08 10:23:00

标签: php zeromq

我使用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);
        }
        // ..

1 个答案:

答案 0 :(得分:7)

ZeroMQ会在关闭时尝试发送待处理的消息 - 您可以通过设置ZMQ :: SOCKOPT_LINGER套接字选项(在连接之前必须执行)来控制它,这应该允许您快速终止。

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

上的ZMQ_LINGER位