php - 使用 ReactPHP 定期向 Ratchet 中的特定客户端发送消息

标签 php timer ratchet reactphp

一般信息
使用 Ratchet PHP 在聊天系统上工作。应我的用户的要求,我正在尝试在特定聊天室中实现 Triviabot。聊天室实际上并不“存在”。相反,它会检查数组中列出了哪些客户端 ID,并且只将消息发送给这些客户端。

这个想法是每 x 秒问一个问题。

问题
实现 ReactPHP 定期计时器不是问题。这是按预期工作的。问题在于,一旦启用计时器,它就会阻止任何与 websocket 的连接。除了客户端说无法建立连接之外,没有任何错误。

相关代码

<?php
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use React\EventLoop\Factory;

class Chat implements MessageComponentInterface {
    private $msgLoop;

    public function __construct() {
        $this->startTriviaBot();
    }

    private function startTriviaBot(){
        $this->msgLoop = Factory::create();

        $this->msgLoop->addPeriodicTimer(1, function (){

            // This is working as expected confirming the timer works fine
            echo 'test'.PHP_EOL;

            foreach($this->clientIDsPerRoom['trivia'] as $receiverID){
                if(array_key_exists($receiverID, $this->userObjects)){

                    $this->sendMessage('Trivia', 'trivia', 'Bot test message', $receiverID);
                }
            }
        });

        // Commenting this makes the websocket accept connections again
        $this->msgLoop->run();
    }
}

我所做的研究没有帮助

Periodically sending messages to clients in Ratchet - 这是通过创建 websocket 而不是在 MessageComponentInterface 内直接向所有客户端发送消息。它无法访问特定客户端。

Create a timer with Ratchet php - 这基本上就是我正在做的事情,但它导致了我遇到的问题。

最佳答案

嘿 ReactPHP 核心团队成员。看起来您正在创建一个新循环来运行计时器。这确实会停止您创建的用于启动 Ratchet 的初始事件循环。您还需要将您为 Ratchet 创建的事件循环传递到此类中并使用该循环。只能有一个事件循环。 (如果您没有将事件循环传递给 Ratchet,它将为您创建一个并使用它。将一个传递给 Ratchet 将覆盖该行为。)

关于php - 使用 ReactPHP 定期向 Ratchet 中的特定客户端发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58633306/

相关文章:

javascript - JS : name of last input element (HTML/PHP)

c++ - 为什么我在使用基于clock()的timer MACRO时会得到一个负值?

Android开发-Unknown Host异常问题

php - 如何向特定用户发送消息 Ratchet PHP Websocket

php - 使用 PHP 发送 POST 请求

php - 如果使用命名空间,Laravel 自定义 View 助手将停止工作

php - WHERE gid=$gid LIMIT 26 不起作用?

.net - 禁用 System.Threading.Timer 的最佳方法

javascript - 如何使用 Ratchet 通过单个 websocket 发送请求发送一组对象?

php - 定期向 Ratchet 中的客户端发送消息