php提示PHP class x has no unserializer解决办法
发布:smiling 来源: PHP粉丝网 添加日期:2013-12-02 21:15:32 浏览: 评论:0
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的原因。
解决这个问题的方法很简单,给每个程序使用不同的缓存池,避免产生数据污染和版本兼容问题。
Tags: 提示 class unserializer
相关文章
- ·Notice:undefined index ..错误提示解决方法(2013-12-02)
- ·linux中phpMyAdmin错误提示Wrong permissions on configuration file, should no(2013-12-02)
- ·PHP中显示出错提示方法介绍(2013-12-03)
- ·phpmyadmin提示无法载入mysqli扩展解决方法(2013-12-03)
- ·php错误提示:Call-time pass-by-reference has been deprecated(2013-12-04)
- ·php提示 Notice: Use of undefined constant name - assumed(2013-12-04)
- ·PHP关闭Notice错误提示(2014-01-03)
- ·php 关闭错误提示方法总结与性能分析(2014-01-03)
- ·php开启与关闭错误提示(2014-02-18)
- ·php删除一条记录(删除确认提示)(2014-05-31)
- ·php错误提示 open_basedir restriction in effect 解决(2014-09-20)
- ·解决php curl获取网页内容提示405 method not allowed状态码(2014-09-21)
- ·php提示Notice: Use of undefined constant错误(2014-09-21)
- ·php实现简单跳转提示的示例代码(2020-02-03)
- ·基于PHP的跳转提示框的实现示例(2020-02-25)
- ·PHP弹出提示框并跳转到新页面即重定向到新页面(2020-08-31)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)