我的PHP脚本通过ZeroMQ与后端运行的PHP守护程序进行通信并等待消息时遇到问题。如果守护进程关闭了,请求 php 会等待无休止的时间。如果我重新加载页面 Firefox 将结束一个无限循环,我必须重新启动 apache2 才能杀死正在运行的请求。尤其是在开发守护程序未完成时,真的很烦人。有人知道我如何设置超时,或者只是说,在无法访问守护程序时跳过请求(然后向管理员发送消息,服务器关闭并发送错误)?
我尝试了这样的事情:
$context = new ZMQContext(1);
$req = new ZMQSocket($context, ZMQ::SOCKET_REQ);
$req->connect("tcp://localhost:5557");
$read = $write = array();
// Poll socket for a reply, with timeout
$poll = new ZMQPoll();
$poll->add($req, ZMQ::POLL_OUT);
$events = $poll->poll($read, $write, 3000);
$errors = $poll->getLastErrors();
if($errors)
echo "No connection";
else
echo "connection";
... $data = ....
$req->send(json_encode($data));
第二个问题,我使用 shaneharter 的 PHP-守护进程,有时当守护进程由于错误而无法正确启动时,或者我使用 CRTL+C 关闭它时 zeromq 仍然保留地址,当我重新启动守护进程时,它会抛出异常,这个地址已经在使用中。我可以轻松销毁所有 ZeroMQ 连接吗?
您不需要轮询只是为了发送简单的消息。 我认为PUSH
插座会更好地为您服务。 设置一个合理的延迟值,这将尝试向PULL
套接字对应方发送消息,无论它是否在侦听。
$context = new ZMQContext();
$socket = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
$socket->setSockOpt(ZMQ::SOCKOPT_LINGER, 2000);
$socket->connect("tcp://localhost:5557");
$socket->send($data);