php - 为什么 websockets 在一段时间后停止广播? (实现使用 ReactPHP、Ratchet 和 ZeroMQ)

标签 php websocket zeromq ratchet reactphp

我有一个小型 websocket 服务器,运行在一组库之上:

  • ReactPHP,
  • Ratchet

  • ZeroMQ,使用 php-zmq 包装器。

代码与教程中的基本相同。

事件循环正确启动,用户能够连接到服务器,他们收到正确的消息,当对方推送一些东西时,但过了一段时间,通常是几天(取决于用法)消息停止到达。

使用量一点也不大 - 目前只有一两个前端开发人员连接,因为这是一个开发阶段。

循环正在运行,它返回 HTTP 101 Switching protocols on connect correctly,但不广播之前正确广播的消息。任何地方都没有错误。重新启动事件循环会有所帮助。

我的问题是:

1) 什么会导致这种情况?有人遇到过类似的行为吗?

2) 你能推荐一种方法让我在事件循环的长时间运行过程中调试它吗?

目前,我必须停止循环,更改代码(添加日志记录调用),重新启动循环并等待它再次出错,这至少是乏味的。

非常感谢任何帮助。

最佳答案

嗯,我猜 ZMQ 是罪魁祸首。

当同一台机器上有多个应用程序使用 ZMQ 时,消息有时会到达错误的消费者 - 即使每个应用程序都指定了不同的端口来连接到 ZMQ 套接字。

因此用户有时会从完全不同的应用程序获取 websocket 帧,当消息没有对应的用户时,该帧会在途中消失。所以 websockets 并没有停止广播,只是消息被错误地路由了。

我对 ZMQ 没有更多的了解,也不知道这是有记录的还是已知的行为。

我通过为每个应用程序使用单独的虚拟主机和 channel 将后端重写为 RabbitMQ 解决了这个问题。现在问题消失了,每一帧都在它应该的地方结束。

关于php - 为什么 websockets 在一段时间后停止广播? (实现使用 ReactPHP、Ratchet 和 ZeroMQ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42119677/

相关文章:

php - 多语言网站的数据库结构

网络托管和 websocket 技术

c# - 使用 ClientWebSocket .net 核心测试 TestHost.WebSocketClient

c++ - 使用成员初始值设定项时 gcc 中可能存在的错误

ZeroMQ 管道返回初始客户端

python - 收到UDP数据包时socketio.emit()

php - Laravel 在 cookie 中存储 session

php - 当我从数据库中提取内容时出现这些字符是什么原因?

PHP 使用 preg_match 或正则表达式作为 array_search 的值或 array_keys_exist 的键

javascript - 在什么情况下 websocket 关闭事件会告诉你 wasClean 是假的?