【问题标题】:Memcached bug in PHP - binary protocolPHP 中的 Memcached 错误 - 二进制协议
【发布时间】:2013-05-08 09:36:41
【问题描述】:

我在 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

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

这是我使用的版本:

  • Ubuntu 12.04 64 位
  • PHP 5.3.14
  • memcached 2.1.0(PECL 模块)
  • libmemcached 1.0.8
  • Memcached 服务器 1.4.13

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

0  RES_SUCCESS
5  RES_WRITE_FAILURE
16 RES_NOTFOUND

[更新]

我对代码进行了更多尝试,并发现了一些更有趣的东西。无论touchset 正在处理的key 如何,都会发生此错误。只要touch 操作返回0(表示成功),set 操作就会失败。

[更新]

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

【问题讨论】:

  • 同样的事情发生在我身上。当我在我的项目中切换到二进制协议时,我开始收到很多“写入失败”错误。你有关于这个问题的任何消息吗?
  • 我在 github 上发布了一个错误。它被标记为已解决,但我不确定它是否真的是。也许你可以在那里关注它:github.com/php-memcached-dev/php-memcached/issues/77

标签: php memcached


【解决方案1】:

好的。

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

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

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

【讨论】:

  • 我相信set 涵盖了replace。尽管如此,replace 也会发生同样的情况(结果代码 5)。
  • 一些消息来源说,这可能是访问 Memcached 服务器太快的问题。为了测试,请尝试在触摸和设置之间设置睡眠功能
  • 感谢您的建议,但没有奏效。我在两行之间插入了sleep(5);,但结果仍然相同。
猜你喜欢
  • 2012-01-21
  • 1970-01-01
  • 2013-07-13
  • 2016-02-06
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2010-09-17
  • 2015-08-16
相关资源
最近更新 更多