1

我的 PHP 脚本通过 ZeroMQ 与在后端运行并等待消息的 PHP 守护程序进行通信时遇到问题。如果守护进程关闭,则请求的 php 会等待无休止的时间。如果我重新加载页面 firefox 以无限循环结束,我必须重新启动 apache2 以终止正在运行的请求。尤其是在daemon没有完成的开发中,真的很烦人。有人知道我如何设置超时,或者只是说,当守护程序无法访问时跳过发送请求(然后向管理员发送消息,服务器已关闭并返回错误)?

我试过这样的事情:

$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-Daemon,有时当守护程序由于错误而无法正确启动或者我用 CRTL+C zeromq 关闭它时,仍然保留地址,当我重新启动守护程序时它会抛出异常,这个地址是已在使用中。我可以轻松销毁所有 ZeroMQ 连接吗?

4

1 回答 1

1

您无需投票即可发送简单的消息。我认为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);
于 2013-05-09T01:24:11.317 回答