將生產環境 PHP 從 5.2.17 升級至 5.3.8 後,原本正常運行的代碼在測試服務器上出現 PHP class X has no unserializer 錯誤。錯誤發生在從 Memcache 讀取緩存對象時。
PHP 5.3.0 起 ArrayObject 類實現了 Serializable 介面,擁有 serialize() 和 unserialize() 方法;而 PHP 5.2 版本的 ArrayObject 未實現此介面。
測試流程導致跨版本緩存污染:
ArrayObject 對象。ArrayObject 缺少 unserialize 方法,拋出錯誤。為不同 PHP 版本(或不同應用)配置獨立的 Memcache 緩存池(或使用不同的 key 前綴),避免跨版本共用緩存導致數據不兼容。
ArrayObject,任何實現 Serializable 介面的類在跨 PHP 版本共用序列化數據時都可能發生。