PHP二进制协议中的Memcached错误


Memcached bug in PHP - binary protocol

我在PHP中使用Memcached时遇到了一个bug。下面是我的代码:

<?php
$mc = new 'Memcached();
$mc->setOption('Memcached::OPT_BINARY_PROTOCOL, true);
$mc->addServer("127.0.0.1", 11211);
$mc->touch("key", time() + 600);
$touchResult = $mc->getResultCode();
$mc->set("key", 1, time() + 600);
$setResult = $mc->getResultCode();
echo "<pre>";
echo "Touch result: $touchResult'n";
echo "Set result: $setResult'n";
echo "</pre>";

第一次运行时,输出如下:

Touch result: 16
Set result: 0

第二次:

Touch result: 0
Set result: 5

纠正我,如果我错了,但这是一个bug,对吗?有人知道解决这个问题的方法吗?

以下是我使用的版本:

  • Ubuntu 12.04 64bit
  • PHP 5.3.14
  • memcached 2.1.0 (PECL模块)
  • libmemcached 1.0.8
  • Memcached server 1.4.13

p。如果您想知道结果代码的含义,它们是:

0  RES_SUCCESS
5  RES_WRITE_FAILURE
16 RES_NOTFOUND
(更新)

我对代码进行了更多的操作,发现了一些更有趣的东西。不管touchset正在工作的key是什么,这个bug都会发生。只要touch操作返回0(这意味着它是成功的),set操作将失败。

(更新)

我还设法制造了一些其他错误。例如,从服务器获取一些key,然后从其他服务器获取add也会导致严重的问题(RES_END代码)。我相信所有这些问题都与二进制协议有关。在我看来,二进制协议的实现几乎不稳定。没有二进制协议的操作也可以正常工作,但是一旦协议设置为二进制,它们就会导致阻塞问题。

好的。

第一次触摸不存在的键-结果是RES_NOTFOUND。当你执行set -时,你写入值success - RES_SUCCESS.

在下次你触摸已存在的键(你设置它在第一次linch),并获得操作RES_SUCCESS的结果,接下来你尝试设置已存在的键值-结果为false。好的。

如果你想改变现有的值,你必须使用Memcached::replace()方法而不是"set"