我一直在使用Ratchet测试PHP websockets,一切都运行良好,直到ZMQSocket :: send突然开始挂起,没有明显的原因。
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'notify');
$res = $socket->send(json_encode($entryData)); //Hangs here.
请注意,我可以使用ZMQ :: MODE_NOBLOCK,这将停止挂起,但它不能解决问题。即客户仍然没有收到任何东西。我也重新启动了我的盒子,这无法解决问题。
更新:我似乎通过将代码更改为:
来解决问题$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));
现在的问题是,为什么它首先悬挂,当它工作正常一两个小时?有什么我需要注意的吗?
答案 0 :(得分:1)
首先,我不确定这是否是一个有效的答案,但我已经玩了几天的php-zmq而且我自己也遇到过一些问题。你的问题引导我一个顿悟,这可能会解决我的问题,我怀疑你的问题可能是相关的。
根据我上次的php-zmq问题,我正在使用zguide中的跳闸方法测试笔记本电脑和我的VPS之间的往返时间。我所做的就是通过将URL添加到我的VPS来更改笔记本电脑上tripping.php脚本的副本,以便它连接到在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是异步的。在php-zmq中使用非阻塞模式时,我的经验对大多数情况都是积极的。
编辑:为可能的问题进行分类--Zeromq在不同的线程中异步处理所有IO。阻塞行为(例如req / rep)是通过IO线程和主线程之间的消息传递创建的,而不是实际的阻塞/同步IO。它是线程之间的消息传递和同步,我认为在PHP中可能是行为不端。 “非阻塞”Zeromq模式似乎工作正常。阻塞模式可以工作,但在这些远程情况下显示出奇怪的行为。