程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php提示PHP class x has no unserializer解決辦法

php提示PHP class x has no unserializer解決辦法

編輯:關於PHP編程

在我們使用php緩存技術時會出現提示PHP class x has no unserializer 下面我們來介紹一下關於這個問題的辦法。

PHP已經出到了5.3.8穩定版本,於是乎准備將公司生產服務器上的PHP從5.2.17升級到5.3.8,在測試服務器上調試的時候卻發現了一個詭異的問題:

雙PHP環境裝好後,原先能在5.2.17正常運行的代碼報錯了,提示PHP class x has no unserializer,而同一套代碼在同服務器上使用5.3.8則沒有任何問題.Google一下了發現沒有什麼有用的信息,看來我是遇到冷門問題了,於是開始逐步debug檢查,發現報錯的地方位於使用memcache取數據的部分,在取出緩存在memcache中的數據時提示我的類沒有反序列化功能,而此行代碼運行在5.3.8的時候卻沒有任何問題. 

鑒於唯一的線索是這個反序列化的提示了,搜索了一下php官方相關序列化的信息,首先找到了序列化接口Serializable的介紹,在這裡我注意到該接口有一個unserializ方法,這個是用於反序列化類時調用的借口. 同時,php的memcache擴展在把php數據對象存到memcache時是會將其序列化的,難道是我自己使用的對象沒有實現Serializable接口的問題?追查了一下代碼發現我存在memcache中的類是繼承於Array_Object類,於是乎跑到官方Array_Object的介紹頁面一看,果然如此,


如上圖,Array_Object從5.3.0開始就實現了Serializable接口,而5.2是沒有實現的。到這裡,這個問題的原因也就明朗了,分析如下:
程序在兩個版本的PHP下運行卻使用同一個memcache緩存池,我先測試的是5.3.8版本,那麼存進去的是PHP5.3的Array_Object對象,該對象在5.3下面可以正常序列化和反序列化,後來我又去訪問了運行在PHP5.2下面的程序,這是在memcache中已經有了緩存對象,所以5.2讀出來的是5.3中序列化的Array_Object對象,而在5.2中Array_Object是沒有實現Serializable接口的,那麼在反序列化時就會出現錯誤,也是就是提示PHP class x has no unserializer的原因。

解決這個問題的方法很簡單,給每個程序使用不同的緩存池,避免產生數據污染和版本兼容問題。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved