9

我一直在用 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,这将停止挂起,但不能解决问题。即客户端仍然没有收到任何东西。我也重新启动了我的盒子,但这并不能解决问题。

  • 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));

现在的问题是,为什么它一开始就挂了,当它正常工作大约一两个小时的时候?有什么需要我注意的吗?

4

1 回答 1

1

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

对于我上一个 php-zmq 问题,我正在使用zguide中的跳闸方法测试我的笔记本电脑和我的 VPS 之间的往返时间。我所做的只是通过将 URL 添加到我的 VPS 来更改我笔记本电脑上的 tripping.php 脚本的副本,以便它可以连接到在 VPS 上远程运行的同一脚本。我在很长的 while 循环中运行同步部分,而异步部分使用相同的 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 模式似乎运行良好。阻塞模式有效,但在这些远程情况下表现出奇怪的行为。

于 2014-02-18T05:21:09.560 回答