【问题标题】:How can I set Realtime WebSocket buffer?如何设置实时 WebSocket 缓冲区?
【发布时间】:2016-02-08 12:06:09
【问题描述】:

我正在开发一个使用 Ratchet 0.3.3、Laravel 5 和 PHP 5.5.9 构建的实时多人游戏,服务器操作系统是 Ubuntu。服务器在每个周期通过 WebSocket(数百个用户)向每个用户发送大约 500 个字节的数据。 看起来 WebSocket 正在缓冲请求并一次发送 5 到 6 个请求(每个请求 500 个字节)。 我们有 30 毫秒的周期。有没有办法手动设置 WebSocket 缓冲区设置,以便可以毫无延迟地发送我的请求?

【问题讨论】:

  • 我不太清楚你的问题。您的 websocket 服务器会每 30 毫秒向连接的客户端发送消息吗?但是现在您的客户一次会收到 5 或 6 条消息?你是什​​么意思“在每个周期发送每个请求”?
  • 是的,我的 websocket 服务器每 30 毫秒向连接的客户端发送消息。问题是这些消息以某种方式排队,客户端一次收到 5 或 6 条消息。每当服务器生成每条消息时,我都需要发送它。
  • 听起来你正在成为 Nagle 算法的牺牲品。我建议设置 TCP_NODELAY 标志,但您使用的是 Ratchet...

标签: php laravel azure websocket ratchet


【解决方案1】:

我找到了解决该问题的方法。首先,IoServer 类从 Ratchet 创建并扩展 IoServer。

class IoServer extends \Ratchet\Server\IoServer {

    public static function factory(MessageComponentInterface $component, $port = 80, $address = '0.0.0.0') {
        $loop   = LoopFactory::create();
        $socket = new Reactor($loop);
        $socket->listen($port, $address);
        $sock = socket_import_stream($socket->master);
        socket_set_option($sock, SOL_TCP, TCP_NODELAY, true);

        return new static($component, $socket, $loop);
    }
}

【讨论】:

    【解决方案2】:

    Azure 本身对 Ubuntu VM 的缓冲区设置没有任何特定限制。首先,我将使用此处列出的命令检查当前缓冲区设置值 - How to find the socket buffer size of linux。 其次,如果你想配置或者调优,可以参考——http://www.cyberciti.biz/faq/linux-tcp-tuning/

    不确定这是否是您正在寻找的答案,正如 Ghedipunk 指出的那样,这可能是 Nagle 算法的问题,在这种情况下,您可能想尝试在隧道配置中添加 tcp_nodelay 配置 -

    socket = l:TCP_NODELAY=1 socket = r:TCP_NODELAY=1

    虽然我个人从未与 Ratchet 合作过。

    PS- 我想将此作为评论添加,因为我不确定这是您正在寻找的正确答案,但 SO 论坛不允许我添加评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多