swoole数据缓存区如何配置控制,swoole支持什么通讯协议
Admin 2022-09-17 群英技术资讯 383 次浏览
TCP是一个流式的协议,客户端向服务器发送一段数据后,可能并不会被服务器一次就完整的接收到。客户端向服务器发送多段数据,可能服务器一次就接收到了全部。
在实际应用中,希望在服务器上能够一次接收一段完整的数据,不多也不少。
传统的TCP服务器中,往往需要由程序员维护一个缓存区,先将读取到数据写入缓存区,然后再通过预先设定好的协议内容来区分一段完整数据的开头、结尾和长度,并将一段完整的数据交给逻辑部分处理,这就是自定义协议的功能。
在Swoole中已经在底层实现了一个数据缓存区,并内置了几种常用的协议类型,并直接在底层做好了数据的拆分,以保证在onReceive回调函数中,一定能够收到一个或数个完整的数据段。
数据缓存区的大小可以通过配置pakcage_max_length来控制。
$configs = []; $configs["package_max_length"] = 8192; $server->set($configs);
swoole目前支持两种通讯协议:EOF结束符协议、固定包头加包体协议
package_max_length
package_max_length用于设置最大数据包尺寸,当开启open_length_check或open_eof_check或open_http_protocol等协议解析后,Swoole底层会进程数据包拼接,此时在数据包未收取完整时,所有数据都将保存在内存中。
所以需要设置package_max_length一个数据包最大允许占用的内存尺寸。
如果同时有1万个TCP连接在发送数据,每个数据包2MB,在最极端的情况下会占用20GB的内存空间。所以此参数不宜设置过大,否则会占用很大的内存。
相关配置选项
open_length_check
当发现数据包长度超过package_max_length时会直接丢弃此数据并关闭连接,因此不会占用任何内存,适用于websocket、mqtt、http2协议。
open_eof_check
由于无法事先得知数据包的长度,所以接收到的数据还是会保存在内存中持续增长。当发现内存占用已经超过package_max_length时,将直接丢地此数据包并关闭连接。
open_http_protocol
HTTP的GET请求最大允许8KB数据且无法修改此配置,POST请求会检测Content-Type,如果发现超过package_max_length则直接丢地此数据,并发送HTTP 400错误并关闭连接。
EOF协议
使用一组固定的、不会在正常数据内出现的字符串/r/n作为分割协议的标记,称之为EOF协议。
什么是EOF协议呢?
EOF全称 End of File,使用\r\n作为结束标记。
在逐个读取数据流中的数据时,如果发现读到EOF标记,就表示已经读到数据末尾。
在TCP的数据流中,使用EOF协议的数据流的特征是|数据|EOF|数据|EOF|。
EOF协议处理的原理是在每串正常数据的末尾会添加一个预先规定的且绝对不会再数据中出现的字符串作为结束标记,这样接收到的数据就可以根据EOF标记来切分数据。
典型的memcached、ftp、stmp都是使用/r/n作为结束符。当发送数据时只要在数据包的末尾添加/r/n即可。
使用EOF协议处理一定要确保数据包中间不会出现EOF,否则将会造成分包错误。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了布隆过滤器(bloom filter)介绍以及php和redis实现布隆过滤器实现方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
本文并没有kafka的安装教程,本文是针对已经安装kafka及其配置好kafka的php拓展并且使用laravel框架进行开发项目,配置一个可供laravel框架使用的生产及消费者类,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇文章能帮助大家解决问题。
下面由Laravel教程栏目给大家介绍关于在laravel中使用clickhouse查询引起的“DB::Exception: Missing columns”问题,希望对大家有所帮助!
这篇文章主要介绍了PhpStorm 如何优雅的调试Hyperf的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在之前的文章中给大家带来了《PHP中应该怎样去完成时区的设置?》,其中给大家介绍了怎样在PHP中设置时区的几种方法,本篇文章我们继续来看一看PHP的相关知识,我们在PHP中应该如何获取当前的时间,希望对大家有帮助!
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008