粘包:(注意: \r\n 必须用双引号,单引号不生效)
1.自定义分隔符
2. package_eof (分隔符 <= 8字节)
- 打开 EOF 检测 open_eof_check
性能好,但无法解决多个数据包合并的问题,需要用户自己分包 - 启用 EOF 自动分包 open_eof_split
逐字节对比,性能差
3.open_length_check 配合pack进行使用(详情见4例子)
包长检测提供了固定包头 + 包体这种格式协议的解析
- 以下情况会关闭连接,丢弃数据 ,不占内存
包长度 > package_max_length
open_eof_check 因为无法事先得知数据包长度,所以收到的数据还是会保存到内存中,持续增长,内存占用 > package_max_length
open_http_protocol GET 请求最大允许 8K,而且无法修改配置,POST 请求会检测 Content-Length,如果 Content-Length > package_max_length,发送 http 400 错误
4.pack/unpack(推荐)
思路:使用pack打包数据(格式:数据长度+数据),收到数据后使用unpack进行拆包,还原数据
$data = '';
$a = 0;
while ($a < 10){
$packdata = pack('n',strlen($a));
$data .= $packdata.$a;
$a++;
}
手动拆包
$send_data = [];
while ($data){ //每次取一个包,读取数据
$unpackdata = unpack('n',$data);
array_push($send_data,substr($data,2,$unpackdata[1]));
$data = substr($data,2+$unpackdata[1]);
}
swoole拆包
'open_length_check' => true,
'package_max_length' => 81920,
'package_length_type' => 'n',
'package_length_offset' => 0,
'package_body_offset' => 2,