我在PHP中使用Memcached发现了一个错误。这是我的代码:
<?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
如果我错了,请纠正我,但这是一个错误吗?有没有人知道这方面的解决方法?
以下是我使用的版本:
PS。如果你想知道结果代码是什么意思,那么它们就是:
0 RES_SUCCESS
5 RES_WRITE_FAILURE
16 RES_NOTFOUND
[UPDATE]
我在代码中玩了一些,发现了一些更有趣的东西。无论key
和touch
正在处理set
,都会发生此错误。只要touch
操作返回0
(这意味着它成功),set
操作就会失败。
[UPDATE]
我还设法产生了一些其他错误。例如从服务器获取一些key
,然后add
获取其他一些也会导致令人讨厌的问题(RES_END
代码)。我相信所有这些问题都与二进制协议有某种关系。在我看来,好像二进制协议的实现几乎不稳定。可以在没有二进制协议的情况下工作的操作就可以了,但是一旦协议设置为二进制,它们就会导致阻塞问题。
答案 0 :(得分:0)
好的。
第一次触摸不存在的键 - 结果为RES_NOTFOUND。当你设置 - 你写成功成功 - RES_SUCCESS。
下次触摸已存在的键(在第一个linch中设置)并获得操作结果RES_SUCCESS,接下来尝试为现有键设置值 - 结果为false。好的。
如果要更改现有值,则必须使用Memcached :: replace()方法而不是“set”