信息发布→ 登录 注册 退出

Swoole的pack和unpack函数怎么用

发布时间:2025-10-01

点击量:
Swoole的pack和unpack函数用于高效序列化和反序列化PHP变量,支持二进制数据且性能优于原生方法。1. swoole_pack将PHP变量转为二进制字符串,适用于网络传输;2. swoole_unpack将二进制数据还原为原始结构;3. 两者需成对使用,确保类型完整,常用于Swoole组件间通信。

Swoole 提供了 packunpack 两个便捷函数,用于在 PHP 中高效地序列化和反序列化数据,常用于网络通信、进程间消息传递等场景。它们比 PHP 原生的 serializejson_encode 更快,且支持二进制数据。

pack:将 PHP 变量打包成二进制字符串

swoole_pack 函数会把任意 PHP 变量转换为紧凑的二进制格式,适合传输或存储。

用法:

swoole_pack($data)

示例:

$data = ['name' => 'Alice', 'age' => 25, 'active' => true];
$packed = swoole_pack($data);
echo strlen($packed); // 输出二进制字符串长度

这个 $packed 是一个二进制字符串,可以直接通过 Swoole 的 TCP/UDP 连接发送。

unpack:从二进制字符串还原 PHP 变量

swoole_unpack 用于将 swoole_pack 生成的二进制数据还原成原始的 PHP 数据结构。

用法:

swoole_unpack($binaryString)

示例:

$unpacked = swoole_unpack($packed);
var_dump($unpacked); // 输出原数组

结果会和原始 $data 完全一致(包括类型)。

实际使用中的注意事项

  • pack 和 unpack 成对使用,确保发送端和接收端都使用 Swoole 的函数,不要混用 JSON 或 serialize。
  • 适用于 Swoole 的 Swoole\ServerSwoole\ClientSwoole\Process 等组件间通信。
  • 支持的数据类型包括:整数、浮点数、字符串、数组(索引和关联)、对象(会序列化属性,类信息可能丢失)、null、布尔值。
  • 不支持资源类型和闭包。
  • 性能高,但数据不可读,不适合调试时直接查看内容。

完整通信示例(服务端-客户端)

服务端代码片段:

use Swoole\Server;

$server = new Server('127.0.0.1', 9501);

$server->on('receive', function ($serv, $fd, $reactorId, $data) {
$unpacked = swoole_unpack($data);
var_dump($unpacked);
$response = ['status' => 'received'];
$serv->send($fd, swoole_pack($response));
});

$server->start();

客户端代码片段:

use Swoole\Client;

$client = new Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9501)) {
die("连接失败");
}

$data = ['action' => 'login', 'user_id' => 1001];
$client->send(swoole_pack($data));

$recvData = $client->recv();
$result = swoole_unpack($recvData);
var_dump($result);

基本上就这些。只要记住:发之前 pack,收之后 unpack,类型就能完整保留,效率也高。

标签:# 闭包  # 更快  # 可以直接  # 就能  # 是一个  # 客户端  # 服务端  # 适用于  # 二进制数  # 序列化  # udp  # 对象  # function  # php  # 数据结构  # 字符串  # die  # if  # strlen  # NULL  # 数据类型  # echo  # swoole  # json  # js  # react  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!