【发布时间】:2016-05-11 10:12:28
【问题描述】:
我有以下情况: 我有一个使用 Ratchet (PHP WebSocket) 运行的 WebSocket 我使用 onMessage() 回调函数来处理传入的数据并做出相应的响应。 如果我通过 WebSocket 收到“开始广播”消息,我必须启动一个循环,该循环将每 0.2 秒向 WebSocket 上所有连接的客户端发送一个广播消息。所以我需要创建一个可以执行此操作的循环,但我不能将它放入 onMessage() 函数中,因为这会阻塞,并且我将无法通过 WS 接收更多消息。 如果我通过 WebSocket 收到“停止广播”消息,我必须停止广播循环。
所以基本上我需要一种方法来启动和停止这个循环,并让这个循环与 WebSocket 循环并行运行,这样它就不会阻塞。
问题:我很确定 Socket->send() 方法不是线程安全的,所以我需要确保 WS 循环和我的广播循环不会同时尝试发送消息。
我考虑过的可能方法:
ReactPHP/Promise
以某种方式使用它来制作一个异步函数,其中我有一个循环。我没有使用 Promise 的经验,也不知道它是否能满足我的需要。运行一个独立的 PHP-CLI 进程,并使用 ZMQ 在 WS 实例和广播循环之间进行进程间通信。
有了这个,我可以从 websocket 来回发送消息,并且 我可以发送消息来开始或停止广播,我也可以 将消息从广播循环发送到 WS 循环以发送 向 WS 客户端发送消息。使用 pthreads
为广播循环生成一个新线程,当我这样做时可以将其杀死 希望它停止。我很确定我必须确保 Socket 是 一次只能被一个线程使用,所以我会以某种方式处理它。
我的问题是,我应该采用哪种方法,是否有建议方法的示例或教程?
【问题讨论】:
标签: php multithreading asynchronous pthreads zeromq