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的原因。

解决这个问题的方法很简单,给每个程序使用不同的缓存池,避免产生数据污染和版本兼容问题。

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » php提示PHP class x has no unserializer解决办法

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡