swoole学习之粘包问题、pack/unpack使用

粘包:(注意: \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,
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值