
快取為什麼不該存物件?從 PHP 到 Java、Python 的反序列化問題
把物件存進 Redis 快取,讀出來可能壞掉,也可能被反序列化攻擊。從 PHP 的 serialize() 出發,對照 Java、Python pickle、Ruby Marshal,說明快取為什麼只該存陣列、字串這類純資料。
架構、快取、資料庫、靜態網站、開發流程——工作裡真正踩過、想過的東西。

把物件存進 Redis 快取,讀出來可能壞掉,也可能被反序列化攻擊。從 PHP 的 serialize() 出發,對照 Java、Python pickle、Ruby Marshal,說明快取為什麼只該存陣列、字串這類純資料。

升級 Laravel 13 後,Redis 快取讀出來變成 __PHP_Incomplete_Class。原因是 cache.php 新增的 serializable_classes 預設為 false,加上快取裡存了物件;說明怎麼找出來、怎麼改成只存陣列,以及過渡用的白名單。

Laravel 12 升級到 13 最快的方式:裝 Laravel Boost,用 /upgrade-laravel-v13 讓 AI agent 檢查 PHP 8.3 需求、更新套件、處理 breaking changes,並跟手動升級、Laravel Shift 比較。