首页 >php教程 >php手册 >Memcached中Perl序列化存储的对象PHP无法读取的解决

Memcached中Perl序列化存储的对象PHP无法读取的解决

WBOY
WBOY原创
2016-06-06 19:55:21814浏览

Perl Memcached的客户端序列化对象采用的是Storable模块的nfreeze方法,而这个方法又调用了c扩展的do_store方法;反序列化使用的是Storable模块的thaw方法,而这个方法又是调用的c扩展的do_retrieve方法。 而在PHP中,进行的却是serialize和unserialize操作

Perl Memcached的客户端序列化对象采用的是Storable模块的nfreeze方法,而这个方法又调用了c扩展的do_store方法;反序列化使用的是Storable模块的thaw方法,而这个方法又是调用的c扩展的do_retrieve方法。

而在PHP中,进行的却是serialize和unserialize操作。造成了无法正常读取的结果。

Perl存储一个('a', 'c')数组的引用,

命令行获取的结果如下:

Memcached中Perl序列化存储的对象PHP无法读取的解决

用二进制编辑器查看存储的结果如下:

Memcached中Perl序列化存储的对象PHP无法读取的解决

在PHP中memcache客户端gzuncompress和unserialize函数处理前可以得到存储的数据,打印出来如下图所示:

Memcached中Perl序列化存储的对象PHP无法读取的解决

和上面二进制编辑器查看的结果是一致的。

 

memcached的官方文档:http://code.google.com/p/memcached/wiki/FAQ

里也提到

Memcached中Perl序列化存储的对象PHP无法读取的解决

由此可以看到,在不同语言的客户端访问memcached,由于对象序列化算法不一致,造成无法直接的进行读取和解析。

比较好的办法是通过通用的格式例如JSON、YAML进行存储和读取,或者调用服务,或者采用Thrift、Gearman这样的跨语言平台来解决。

但是对于已有的数据,有没有可以直接访问的办法呢?

 

Perl可以可以安装PHP serialize and unserialize in Perl模块实现和php一样的序列化,具体解决办法参加惊峰的博客:http://www.jeftom.com/?p=212#respond。

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn