Php ZMQ挂起-ZMQSocket::发送

Php ZMQ挂起-ZMQSocket::发送,php,zeromq,ratchet,Php,Zeromq,Ratchet,我一直在用Ratchet测试PHP WebSocket,一切都很正常,直到ZMQSocket::send突然开始无缘无故地挂起 $context = new ZMQContext(); $socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'notify'); $res = $socket->send(json_encode($entryData)); //Hangs here. 请注意,我可以使用ZMQ::MODE_NOBLOCK,这将停

我一直在用Ratchet测试PHP WebSocket,一切都很正常,直到ZMQSocket::send突然开始无缘无故地挂起

$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'notify');
$res = $socket->send(json_encode($entryData)); //Hangs here.
请注意,我可以使用ZMQ::MODE_NOBLOCK,这将停止挂起,但它无法解决问题。i、 客户仍然没有收到任何东西。我也重新启动了我的盒子,但它并没有解决这个问题

  • Ubuntu 12.04.1 LTS
  • PHP版本5.3.10-FPM/(&CLI用于推送服务器)
  • ZMQ扩展版本1.1.2
  • libzmq版本2.1.11
更新:我似乎已通过将代码更改为:

$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'notify');
$socket->setSockOpt(ZMQ::SOCKOPT_LINGER, 30); //ADDED
$socket->connect("tcp://localhost:5557"); //ADDED
$res = $socket->send(json_encode($entryData));

现在的问题是,当它正常工作了一两个小时时,为什么它会挂在第一位?有什么我需要注意的吗?

首先,我不确定这是否是一个有效的答案,但我已经玩了几天php zmq,我自己也遇到了一些问题。你的问题让我顿悟,这可能会解决我的问题,我怀疑你的问题可能与此相关

关于我的上一个php zmq问题,我正在使用中的tripping方法测试笔记本电脑和VP之间的往返时间。我所做的只是在我的笔记本电脑上更改tripping.php脚本的一个副本,将URL添加到我的VPS,这样它就可以连接到远程运行在VPS上的同一个脚本。我在长时间循环中运行同步部分,异步部分使用相同的for循环

我注意到,在执行同步循环时,一次只能连接一个“客户机”,无论是尝试从我的笔记本电脑连接多个客户机,还是从我的笔记本电脑连接一个客户机,以及从其他服务器连接一个客户机,等等。一次只能连接一个客户机。我还注意到,在异步部分中,我的信息从每秒100条左右下降到每次2秒左右,只要信息开始回到我的笔记本电脑上。我的笔记本电脑可以使用cURL轻松地每秒执行10+个HTTP请求,因此每条消息2秒与网络无关

我作为PHP扩展开发人员和PHP核心黑客已经6年了,以前也遇到过类似的问题。我很确定这是由于PHP用户空间和内部Zeromq线程之间的并发问题造成的。换句话说,Zeromq IO线程向主Zeromq线程发送命令,但主Zeromq线程通过Zend引擎在PHP内执行,并且与其他PHP方法/函数具有相同的基本行为。我还不确定我们是否可以期望php zmq中的行为与czmq或其他zeromq绑定中的行为完全相同,因为php本质上是非常同步的,zeromq是异步的。在PHPZMQ中使用非阻塞模式时,我的经验在很大程度上是积极的


编辑:分类可能的问题-Zeromq在单独的线程中异步处理所有IO。阻塞行为(如req/rep)是通过IO线程和主线程之间的消息传递创建的,而不是实际的阻塞/同步IO。我认为在PHP中,线程之间的消息传递和同步可能会出现错误。“非阻塞”Zeromq模式似乎工作正常。阻塞模式可以工作,但在这些远程情况下显示出奇怪的行为。

除了我的答案之外,您似乎使用了一个相当旧的0mq版本。您是否也可以显示另一面的代码?可能重复:@flup-这是一个php zmq问题。此外,此问题中的问题发生在发送时,而不是关闭时。python的问题来自这样一个事实:当消息仍在其队列中等待时,zeromq将不允许推送客户端关闭。等待队列完成是正常的,而不是阻塞发送。