打开包长检测特性。包长检测提供了固定包头+包体这种格式协议的解析。启用后,可以保证Worker
进程onReceive
每次都会收到一个完整的数据包。代码如下:
server端:
$server = new swoole_server('0.0.0.0',9501);
$server->set([
'open_length_check' => true,
'package_max_length' => 81920,
'package_length_type' => 'N',
'package_length_offset' => 0,
'package_body_offset' => 4,
]);
$server->on('receive',function(swoole_server $server,$fd,$reactor_id,$data){
//var_dump($server->getClientInfo($fd));
echo 'receive data:'.($data).PHP_EOL;
});
$server->start();
function tcp_unserialize($data){
$recvData = unserialize(substr($data,4));
return $recvData;
}
client端:
$client = new swoole_client(SWOOLE_SOCK_TCP);
$client->connect('127.0.0.1',9501);
$client->send(tcp_serialize("world hi"));
$client->send(tcp_serialize('hello hi'));
function tcp_serialize($data) {
$sendStr = serialize($data);
var_dump($sendStr);
$sendData = pack('N',strlen($sendStr)).$sendStr;
var_dump($sendData);
return $sendData;
}
server输出结果:(因为添加了swoole_debug扩展所以有额外信息)log_level可调整
client端结果: