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

时间:2017-02-08 17:21:35

标签: php websocket zeromq ratchet reactphp

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

  • ReactPHP,
  • 棘轮

  • ZeroMQ,使用 php-zmq 包装。

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

eventloop正确启动,用户可以连接到服务器,他们正在收到正确的消息,当另一方推送时,但过了一段时间,通常是几天(取决于用法)消息停止到达。

根本没有压倒性的使用 - 目前只有一两个前端开发人员连接,因为这是一个开发阶段。

循环正在运行,它在连接时正确返回HTTP 101切换协议,但不会广播之前正确广播的消息。没有任何错误。重新启动事件循环会有所帮助。

我的问题是:

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

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

嗯,我猜ZMQ是罪魁祸首。

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

因此,用户有时会从完全不同的应用程序中获取websocket框架,并且当消息没有相应的用户时,框架就会消失。所以websockets没有停止广播,消息只是路由不正确。

我对ZMQ没有更多的了解,以及这是一个记录在案的或其他已知的行为。

我通过为每个应用程序使用单独的vhost和通道重写后端到RabbitMQ来解决了这个问题。问题现在已经消失,每一帧都应该到达应有的位置。