tokyo tyrant 在 php 上不能自动反序列化的问题

前一阵试用 tokyo tyrant 碰到一个麻烦,
在php上用memcache接口,取出数据的时候,不会自动反序列化。比如了一个 array(1,2,3,4,5),出来就是 ‘a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;}’ 了。

用 Wireshark 跟踪了一下,发现和标准memcached返回的数据里差一个字节。去看了下 memcached 协议,发现这个字节是个客户端的标记 flag 。存储的时候放置这个标志,取的时候照样返回。php 的 memcache 扩展应该就是用这个字节来标志是否是 php 的数据。如果匹配则反序列化。对比 tokyo tyrant 的源代码,发现它在存取的时候无视了这个标记位(其实还无视了一些其他东西,比如过期时间之类的,只用了 key 和 value 以及他们的长度),所以就有了这个结果。

之前考虑改 tokyo tyrant ,做了个补丁。不过正如 xdanger
所说,这个办法不好。之前测试得不仔细,后来试了几个不同的类型,果然是出了问题。于是又考虑再改 php
的客户端。让它不管什么类型存储的时候都去做序列号。似乎是解决了反序列号问题。这样修改版的客户端放的东西原版的能正常读取,但原版客户端一旦放了常规值就会出毛病。这一下同时改了客户端和服务端,另外,压缩的问题也还是没解决。看来这个问题还真的很难。

php 客户端补丁,修改 memcache.c
 http://syre.blogbus.com/files/12229540080.diff

 tokyo tyrant 补丁,修改 ttserver.c
http://syre.blogbus.com/files/12227686210.diff

 

2 thoughts on “tokyo tyrant 在 php 上不能自动反序列化的问题

  1. Willko February 15, 2009 / 2:16 am

    这个是我解决方法,http://willko.javaeye.com/admin/blogs/332982
    我把你的解决方法加到我blog中了,通过连接,希望不介意。

  2. xdanger September 30, 2008 / 7:15 pm

    这个补丁实际用处不大,只是强制把返回的数据的 FLAG 标记为 1,可能就对于自己写 memcached client 的有用吧。
    现在多个流行的 memcached client 都会先判断存进去的数据是否为标量,标量的话是不会序列化的。还有,,,如果是存进去就有压缩的,那就会是 3 或者 2……
    tt 还有个致命问题,就是存进去的数据不到满了不会过期,这个不知道是不是设计上的缺陷,很难说官方会解决这个问题。memcached 因为有过期的严格限制,我就不用验证取出的缓存的有效性,而且还不用另一个进程去清除缓存,这是 memcached 最可爱的地方。而且,memcached 的应用不应该是存那些永久储存的数据,memcached 的协议: http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt 已经提到以后版本会加入强制缓存不超过30天的限制
    In the latter case, this number of seconds may not exceed 606024*30 (number of seconds in 30 days); if the number sent by a client is larger than that, the server will consider it to be real Unix time value rather than an offset from current time.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s