多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# socket\_buffer\_size [TOC] 配置客户端连接的缓存区长度。从`1.8.8`版本开始底层对于缓存区控制的参数分离成`buffer_output_size`和`socket_buffer_size`两项配置。 参数`buffer_output_size`用于设置单次最大发送长度。`socket_buffer_size`用于设置客户端连接最大允许占用内存数量。 ~~~ $server->set([ 'socket_buffer_size' => 128 * 1024 *1024, //必须为数字 ]) ~~~ * 单位为字节,如`128 * 1024 *1024`表示每个TCP客户端连接最大允许有`128M`待发送的数据 * 默认为`2M`字节 ## 数据发送缓存区 调整连接发送缓存区的大小。TCP通信有拥塞控制机制,服务器向客户端发送大量数据时,并不能立即发出。这时发送的数据会存放在服务器端的内存缓存区内。此参数可以调整内存缓存区的大小。 如果发送数据过多,客户端阻塞,数据占满缓存区后`Server`会报如下错误信息: ~~~ swFactoryProcess_finish: send failed, session#1 output buffer has been overflowed. ~~~ > 发送缓冲区塞满导致`send`失败,只会影响当前的客户端,其他客户端不受影响 > 服务器有大量`TCP`连接时,最差的情况下将会占用`serv->max_connection * socket_buffer_size`字节的内存 **尤其是外围通信的服务器程序,网络通信较慢,如果持续连续发送数据,缓冲区很快就会塞满。发送的数据会全部堆积在`Server`的内存里。因此此类应用应当从设计上考虑到网络的传输能力,先将消息存入磁盘,等客户端通知服务器已接受完毕后,再发送新的数据。** 如视频直播服务,`A`用户带宽是`100M`,`1秒`内发送`10M`的数据是完全可以的。`B`用户带宽只有`1M`,如果`1秒`内发送`10M`的数据,`B`用户可能需要`100秒`才能接收完毕。这时数据会全部堆积在服务器内存中。 可以根据数据内容的类型,进行不同的处理。如果是可丢弃的内容,如视频直播等业务,网络差的情况下丢弃一些数据帧完全可以接受。如果内容是不可丢失的,如微信消息,可以先存储到服务器的磁盘中,按照`100`条消息为一组。当用户接受完这一组消息后,再从磁盘中取出下一组消息发送到客户端。