我有一个小型 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/