函數簽名
serialize(mixed $value): string
unserialize(string $data, array $options = []): mixed
基本用法
<?php
$data = ['key' => 'website', 'value' => 'www.chhua.com', 'tags' => ['php', 'serialize']];
$serialized = serialize($data);
echo $serialized;
// a:3:{s:3:"key";s:7:"website";s:5:"value";s:15:"www.chhua.com";s:4:"tags";a:2:{i:0;s:3:"php";i:1;s:9:"serialize";}}
$restored = unserialize($serialized);
print_r($restored);
// 完全還原原數組結構、類型
對象序列化
class User {
public string $name;
private int $id;
public function __construct(string $name, int $id) {
$this->name = $name;
$this->id = $id;
}
public function __sleep(): array { return ['name', 'id']; } // 控制序列化哪些屬性
public function __wakeup(): void { /* 還原後初始化,如重連 DB */ }
}
$user = new User('Tom', 123);
$ser = serialize($user); // O:4:"User":2:{s:4:"name";s:3:"Tom";s:2:"id";i:123;}
$newUser = unserialize($ser); // 觸發 __wakeup
核心應用場景
- 緩存存儲:Redis/Memcached 存儲複雜數組/對象,
serialize 入庫,unserialize 取出。
- Session 存儲:PHP 默認 Session handler 即用 serialize 存文件。
- 跨進程通信:消息隊列(RabbitMQ、Kafka)傳遞 PHP 結構化數據。
- 配置文件:將陣列序列化存 .conf/.cache 文件,比 JSON 支持更多類型(資源、對象)。
- 深度複製:
$clone = unserialize(serialize($obj)) 快速深拷貝(含私有屬性)。
安全警示:反序列化漏洞
- 絕不 unserialize 不可信數據:攻擊者構造惡意序列化字符串,利用
__wakeup/__destruct/__toString 魔術方法觸發 RCE(如 GuzzleHttp\Psr7\FnStream 鏈)。
- PHP 7.0+
unserialize($data, ['allowed_classes' => ['MyClass', 'OtherClass']]) 白名單限制可實例化類。
- 優先使用
json_encode/decode 或 igbinary(不支持對象,但安全、快速、體積小)。
性能對比
| 方案 | 速度 | 體積 | 類型支持 | 安全性 |
| serialize | 中 | 大 | 全(資源除外) | 低(需白名單) |
| json_encode | 快 | 中 | 標量/陣列/對象(public) | 高 |
| igbinary | 極快 | 小 | 標量/陣列/對象 | 高 |
| msgpack | 極快 | 極小 | 標量/陣列 | 高 |
最佳實踐
- 內部可信存儲(Redis Session、文件緩存)用
serialize 或 igbinary(安裝擴展後 ini_set('session.serialize_handler', 'igbinary'))。
- API 輸出、前端交互、日誌記錄用
json_encode。
- 高性能 RPC 內部通信用
msgpack / protobuf。
- 任何來自用戶/第三方的數據 禁用 unserialize,改用 JSON + 結構驗證。