memcache与memcached版本间的一个BUG:Memcache delete无效

the Memcache::delete(key) function is broken on several combinations of memcached+pecl-memcache combinations.

pecl-memcache 2.2.5 + memcached 1.4.2 - Memcache::delete(key) WORKS

pecl-memcache 2.2.5 + memcached 1.4.3 - Memcache::delete(key) DOES NOT WORK

pecl-memcache 2.2.5 + memcached 1.4.4 - Memcache::delete(key) WORKS

pecl-memcache 2.2.5 + memcached 1.4.5 - Memcache::delete(key) WORKS

pecl-memcache 3.0.4 + memcached 1.4.2 - Memcache::delete(key) WORKS

pecl-memcache 3.0.4 + memcached 1.4.3 - Memcache::delete(key) DOES NOT WORK

pecl-memcache 3.0.4 + memcached 1.4.4 - Memcache::delete(key) DOES NOT WORK

pecl-memcache 3.0.4 + memcached 1.4.5 - Memcache::delete(key) DOES NOT WORK

程序在线上部署时出现这样离奇的问题,真是愁死人。
在网上找到解决办法,不过,我最后将cached换成了redis~

http://5iwww.blog.51cto.com/856039/269348

使用 memcache 的过程中,遇到一个奇怪的问题,在 CentOS 环境下,PHP 的 memcache 扩展创建的客户端对象,在 delete 一个 key 的时候报错:
[25-Nov-2009 13:57:04] PHP Notice: Memcache::delete(): Server 192.168.10.131 (tcp 11211) failed with: CLIENT_ERROR bad command line format. Usage: delete [noreply]
可是在 Windows 环境下,用的人家编译好的 php_memcache-cvs-20090703-5.3-VC6-x86.dll (20KB) 却没问题!
在 Google 上找了半天,终于在 PHP 官方手册的评论中发现了线索:
http://php.net/manual/en/function.memcache-delete.php
请看 10-Nov-2009 11:17 这条,简短翻译一下:
memcache 这个 PECL 扩展的 2.2.5 稳定版本有一个错误,导致在向 memcached 1.4.3 调用 delete 方法时返回 false。
用 -vvv 模式运行 memcached 将显示出为什么 delete 调用失败:
CLIENT_ERROR bad command line format. Usage: delete
[noreply]
简单修改一下,在这个 PECL 扩展的 memcache.c 这个文件的 1494 行的 mmc_delete() 函数中。把 command_len 修改为下面这样:
command_len = spprintf(&command, 0, "delete %s", key);
去掉了弃用的第 3 个参数,然后 delete 就可以工作了。
再提示一下改动前的代码:
// command_len = spprintf(&command, 0, "delete %s %d", key, time);
修改完成后,重新编译出 memcache.so 即可。

修改源码并不能保证以后会出现什么问题。问题的根本是memcached 1.4.3版本同memcached 1.4.0版本的delete函数不一样。

我最后的解决方案是memcache用2.2.5,memcached用1.4.0版本。
经测试,一切OK..

发表评论

电子邮件地址不会被公开。