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

Swoole 提供了 pack 和 unpack 两个便捷函数,用于在 PHP 中高效地序列化和反序列化数据,常用于网络通信、进程间消息传递等场景。它们比 PHP 原生的 serialize 和 json_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\Server、Swoole\Client、Swoole\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,类型就能完整保留,效率也高。










