【问题标题】:PHP WebSocket Async taskPHP WebSocket 异步任务
【发布时间】: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


    【解决方案1】:

    如果我猜对了:

    • 你进入一个网络套接字 - 命令“开始”
    • 收到请求后,想用0.2开始广播 秒间隔
    • 如果你会来 - 命令“停止”,你需要停止广播

    也许我误解了这个问题,但这是个坏主意,让客户端请求开始和停止广播(如果每个人都发送“开始命令”怎么办?)

    一般来说,我会推荐使用 ZMQ。这是最具扩展性的解决方案。 (最好将服务分开)

    • 您启动服务器。
    • 正在等待来自 ZMQ 的命令,您需要开始广播。
    • 获得 ZMQ 命令后,创建一个间隔为 0.2 秒的计时器并进行广播
    • 一旦您在 ZMQ 中获得“命令”停止 - 终止计时器。

    • 您启动服务器 ZMQ PUB 并开始广播
    • 你启动 web-socket
    • 你给命令 start 和 start 接收 ZMQ SUB 消息
    • 你给命令 stop 和 stop 接收 ZMQ SUB 消息

    如果您想要发布/订阅服务。然后只需创建一个 Timer 并列出要广播的对象。客户端发送“订阅”,并接收消息。好主意使用 Redis 在进程之间存储数据(WebSocket - ZMQ)

    在使用 ZMQ 之前,您需要阅读 ZMQ PHP DOC 并查看 reactphp/zmq lib

    【讨论】:

    • 在这种情况下,让客户端请求开始和停止广播并不是一个坏主意。这是用于控制比赛的程序。多个客户端连接,但只有一个发起比赛,当有人获胜时,他们停止比赛。广播的数据是从传感器设备获取的赛车手的速度数据。如果多个赛车手发送启动命令,它不会做任何坏事,它只是简单地控制是否从传感器广播速度数据。
    • 感谢您的反馈,我选择了 ZMQ 解决方案。
    猜你喜欢
    • 2012-06-28
    • 2010-10-25
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    相关资源
    最近更新 更多