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

PHP 序列化 vs JSON 深度對比:性能、跨語言、存儲選型指南

     編輯:PHP 相關知識

PHP `serialize` vs `json_encode`:不只是格式之爭

兩者均將變量轉為字符串以便存儲/傳輸,但設計初衷、適用場景、性能特徵截然不同。本文從原理、實測、選型三個維度深度解析。

核心差異速覽表

維度serialize()json_encode()
輸出格式PHP 專有二進制安全字符串 (含類型、長度、結構)通用 JSON 文本 (UTF-8, 鍵值對, 數組/對象)
可讀性極低 (需反序列化才能讀懂)高 (人類可直接閱讀、編輯)
跨語言否 (僅 PHP 可解析)是 (所有主流語言原生支援)
對象支援完美 (保留類名、屬性可見性、魔術方法 __sleep/__wakeup)僅公開屬性 (私有/受保護屬性丟失), 需實現 JsonSerializable
資源類型不可序列化 (報錯)不可編碼 (報錯/轉為 null)
性能 (序列化)略快 (原生二進制格式)稍慢 (UTF-8 編碼、轉義處理)
性能 (反序列化)快快 (原生 C 級實現)
體積較大 (類型標識、長度前綴)較小 (純文本, 無類型元數據)
安全性風險高 (反序列化可觸發 __wakeup/魔術方法, 導致 RCE)安全 (純數據, 無代碼執行風險)

實戰代碼對比

$data = [
    'game' => '德乙',
    'home' => '比勒費爾德',
    'guest' => '不倫瑞克',
    'time' => '2024-08-21'
];

// serialize
$ser = serialize($data);
// a:4:{s:4:"game";s:6:"德乙";s:4:"home";s:15:"比勒費爾德";s:5:"guest";s:12:"不倫瑞克";s:4:"time";s:10:"2024-08-21";}
$restored = unserialize($ser); // 完美還原

// json_encode
$json = json_encode($data, JSON_UNESCAPED_UNICODE);
// {"game":"德乙","home":"比勒費爾德","guest":"不倫瑞克","time":"2024-08-21"}
$decoded = json_decode($json, true); // 關聯數組
$obj = json_decode($json); // stdClass 對象

選型決策樹

  1. 需跨語言/前端交互/API 輸出/配置文件/日誌記錄 → 唯一選 JSON。
  2. 純 PHP 內部緩存/Session/隊列傳遞複雜對象 (含私有屬性、資源管理) → 可考慮 serialize,但必須確保數據來源可信 (防反序列化漏洞)。
  3. 高性能緩存 (Redis/Memcached) 存儲純數據結構 (數組/標量) → 推薦 JSON (體積小、解析快、可直接被 Lua 腳本/其他服務消費)。
  4. 存儲到 MySQL `TEXT/BLOB` 欄位 → JSON 更利於 JSON_EXTRACT、->> 索引查詢 (MySQL 5.7+/8.0 原生 JSON 類型更佳)。
  5. 對象持久化/異步任務載荷 → 現代框架 (Laravel/Symfony) 統一採用 JSON + 類映射 (如 Illuminate\Contracts\Queue\QueueableEntity),放棄 `serialize`。

安全警示:反序列化漏洞 (POP Chain)

// 危險示例: 反序列化用戶可控數據
$data = $_COOKIE['user_data']; // 攻擊者構造惡意序列化字符串
$user = unserialize($data); // 觸發 __wakeup -> __destruct -> RCE

// 防禦:
1. 永遠不要 unserialize() 不可信數據 (Cookie、Request、數據庫用戶字段)。
2. 必須用時: PHP 7.0+ 使用 allowed_classes 選項
   $obj = unserialize($data, ['allowed_classes' => [User::class, DTO::class]]);
3. 生產環境統一遷移至 JSON + 白名單類映射機制。

性能優化小貼士

  • json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) 減少轉義體積。
  • 大數組序列化前考慮 igbinary 擴展 (二進制、更快、更小),支援 `serialize`/`unserialize` 兼容 API。
  • 避免在循環中重複編碼相同數據,提取複用。

結論: 現代 PHP 開發中,JSON 是 95%+ 場景的最優解。`serialize` 仅保留在極少數需要完整對象圖持久化且環境完全可控的legacy場景。新項目請毫猶豫選 JSON。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved