近日,有用户来问宇润,他用的是 imiphp/imi-workerman-gateway
。Workerman 作为网关和注册中心,Swoole 作为 Worker。
他的问题是,循环向客户端推送大量数据(大概几百K到几MB不等),在浏览器中只能收到前几次,后面的就收不到了。
Gateway 网关层还会报错:send buffer full and drop package
这个问题一般出现在,服务器循环发送数据给客户端,导致塞满发送缓冲区。
解决办法:
如果你是 Workerman,可以在入口文件中加上:
// 发送缓冲区大小,单位:字节。可以根据需要调整,不建议设置得很大,会浪费内存
\Workerman\Connection\TcpConnection::$defaultMaxSendBufferSize = 2 * 1024 * 1024;
如果你是 Workerman Gateway,可以在服务器配置中的 configs
加上相应配置:
[
'gateway' => [
'namespace' => 'Imi\WorkermanGateway\Test\AppServer\Gateway',
'type' => Imi\WorkermanGateway\Workerman\Server\Type::GATEWAY,
'socketName' => 'websocket://0.0.0.0:8081', // 网关监听的地址
'configs' => [
'lanIp' => '127.0.0.1',
'startPort' => 12900,
'registerAddress' => '127.0.0.1:13004',
// 发送缓冲区大小,单位:字节。可以根据需要调整,不建议设置得很大,会浪费内存
'sendToClientBufferSize' => 2 * 1024 * 1024,
],
],
]
至此,问题顺利解决~