首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP -二进制协议中的Memcached bug

PHP -二进制协议中的Memcached bug
EN

Stack Overflow用户
提问于 2013-05-14 07:35:54
回答 1查看 1K关注 0票数 2

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

代码语言:javascript
复制
<?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>";

当您第一次运行此命令时,输出如下:

代码语言:javascript
复制
Touch result: 16
Set result: 0

这是第二次:

代码语言:javascript
复制
Touch result: 0
Set result: 5

如果我错了就纠正我,但这是个错误,对吗?有人知道解决办法吗?

下面是我使用的版本:

  • Ubuntu12.04 64位
  • PHP5.3.14
  • memcached 2.1.0 (PECL模块)
  • libmemcached 1.0.8
  • Memcached服务器1.4.13

PS。如果您想知道结果代码意味着什么,请看这里:

代码语言:javascript
复制
0  RES_SUCCESS
5  RES_WRITE_FAILURE
16 RES_NOTFOUND

更新

我对代码做了更多的分析,发现一些更有趣的东西。无论touchset正在处理的是什么touch,都会发生这种错误。只要touch操作返回0 (这意味着成功),set操作就会失败。

更新

我也设法产生了一些其他的错误。例如,从服务器获取一些key,然后再对其他add进行add处理,也会导致严重的问题(RES_END代码)。我相信所有这些问题都与二进制协议有关。在我看来,二进制协议的实现似乎不太稳定。没有二进制协议就可以工作的操作会做得很好,但是一旦协议被设置为二进制,就会导致阻塞问题。

EN

回答 1

Stack Overflow用户

发布于 2013-05-14 07:44:49

好的。

在第一次,您触摸没有存在的关键-结果是RES_NOTFOUND.当你设置-你写值成功- RES_SUCCESS。

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

如果要更改现有值,则必须使用Memcached::替换()方法而不是"set“

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16537528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档