php - Ratchet WebSocket - 立即发送消息

标签 php websocket ratchet

我必须在发送消息之间做一些复杂的计算,但是第一条消息在计算后与第二条消息一起发送。我怎样才能立即发送?

<?php

namespace AppBundle\WSServer;

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class CommandManager implements MessageComponentInterface {

    public function onOpen(ConnectionInterface $conn) {
        //...
    }

    public function onClose(ConnectionInterface $connection) {
        //...
    }

    public function onMessage(ConnectionInterface $connection, $msg) {
        //...
        $connection->send('{"command":"someString","data":"data"}');

        //...complicated compulting
        sleep(10);

        //send result
        $connection->send('{"command":"someString","data":"data"}');
        return;
    }
}

启动服务器:

$server = IoServer::factory(
              new HttpServer(
                  new WsServer(
                      $ws_manager
                  )
              ), $port
);

最佳答案

send 最终到达 React 的 EventLoop,它在“准备好”时异步发送消息。同时它放弃执行,然后脚本执行您的计算。到此完成时,缓冲区将发送您的第一条和第二条消息。为避免这种情况,您可以告诉计算在当前缓冲区耗尽后作为一个滴答在 EventLoop 上执行:

class CommandMessage implements \Ratchet\MessageComponentInterface {
    private $loop;
    public function __construct(\React\EventLoop\LoopInterface $loop) {
        $this->loop = $loop;
    }

    public function onMessage(\Ratchet\ConnectionInterface $conn, $msg) {
        $conn->send('{"command":"someString","data":"data"}');

        $this->loop->nextTick(function() use ($conn) {
            sleep(10);

            $conn->send('{"command":"someString","data":"data"}');
        });
    }
}

$loop = \React\EventLoop\Factory::create();

$socket = new \React\Socket\Server($loop);
$socket->listen($port, '0.0.0.0');

$server = new \Ratchet\IoServer(
    new HttpServer(
        new WsServer(
            new CommandManager($loop)
        )
    ),
    $socket,
    $loop
);

$server->run();

关于php - Ratchet WebSocket - 立即发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30753763/

相关文章:

php.ini 不能在 public_html 目录之外工作

php - 尝试连接到我的 SQL 数据库但抛出错误

node.js - socket.io - 传输关闭

python - 从 websocket 读取数据而不阻塞代码

php - 无法在多 MYSQL 查询语句上获取结果

php - 如何查看 mysql 是否替换或插入我的查询

javascript - Windows 上 JavaScript 和 C/C++ 之间的 TCP 连接

php - WebSocket 连接失败:连接建立时出错:net::ERR_CONNECTION_TIMED_OUT

PHP 文件通过 CLI 执行时返回空白

php - 如何使用 Ratchet 在线显示连接的用户?