首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP serialize 與 unserialize:序列化存儲與還原的黃金搭檔

     編輯:PHP 綜合知識

函數簽名

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

核心應用場景

  1. 緩存存儲:Redis/Memcached 存儲複雜數組/對象,serialize 入庫,unserialize 取出。
  2. Session 存儲:PHP 默認 Session handler 即用 serialize 存文件。
  3. 跨進程通信:消息隊列(RabbitMQ、Kafka)傳遞 PHP 結構化數據。
  4. 配置文件:將陣列序列化存 .conf/.cache 文件,比 JSON 支持更多類型(資源、對象)。
  5. 深度複製:$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極快極小標量/陣列高

最佳實踐

  1. 內部可信存儲(Redis Session、文件緩存)用 serialize 或 igbinary(安裝擴展後 ini_set('session.serialize_handler', 'igbinary'))。
  2. API 輸出、前端交互、日誌記錄用 json_encode。
  3. 高性能 RPC 內部通信用 msgpack / protobuf。
  4. 任何來自用戶/第三方的數據 禁用 unserialize,改用 JSON + 結構驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved