php提示PHP class x has no unserializer解决办法_PHP教程

WBOY
Lepaskan: 2016-07-13 10:56:24
asal
958 orang telah melayarinya

在我们使用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.bkjia.comtruehttp://www.bkjia.com/PHPjc/632184.htmlTechArticle在我们使用php缓存技术时会出现提示PHP class x has no unserializer 下面我们来介绍一下关于这个问题的办法。 PHP已经出到了5.3.8稳定版本,于是乎...
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan