如何设置Realtime WebSocket缓冲区?

时间:2015-11-07 11:17:15

标签: php laravel azure websocket ratchet

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

2 个答案:

答案 0 :(得分:2)

我找到了解决这个问题的方法。首先,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);
    }
}

答案 1 :(得分:0)

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论坛不允许我添加评论。