【问题标题】:php memcached enyim client flag problemphp memcached enyim 客户端标志问题
【发布时间】:2011-07-29 23:04:25
【问题描述】:

我正在尝试将 memcached 与 php (memcached) 和 C# (enyim) 客户端一起使用。 我有一个场景,我想在 php 中 CAS 一个值。为此,我使用以下代码:

$memcached = new Memcached;
$memcached->addServer('localhost', 11211) or die ("Could not connect");
$memcached->setOption(Memcached::OPT_COMPRESSION, false); // the enyim client doesn't support compression
do {
    $entries = $memcached->get($theKey, null, $cas);
    if ($memcached->getResultCode() == Memcached::RES_NOTFOUND) {
        $entry = somearray("foo");
        $memcached->add($theKey, $entry);
    } else {
        $entries[] = "bar";
        $memcached->cas($cas, $theKey, $entries);
    }
}
while ($memcached->getResultCode() != Memcached::RES_SUCCESS AND $memcached->getResultCode() != Memcached::RES_END);

这一切都很好,一开始就很好。 但是,当 C# 客户端 CAS 的值相同时,它就会出错。 php 在以下位置发出警告:

$entries = $memcached->get($theKey, null, $cas);

即:

 PHP Warning:  Memcached::get(): could not uncompress value in ... at line ...

结果出现无限循环。

现在我尝试通过 telnet 从 memcached 服务器获取密钥,并且数据就在那里。 在 php 中,我也可以毫无问题地设置这个键。

我注意到一件事:在 php 客户端设置了某些东西之后,标志为 0。 现在,在 C# 客户端对值进行 CAS 处理后,标志为 274。 php lib上是否有一些标志冲突?还是别的什么?

如果有人能帮我解决这个问题,我将不胜感激!

王者荣耀

[编辑]

那好吧。由于这个问题没有得到答案,所以让我换一种说法。 有没有办法阻止 C# 客户端设置标志 274?

【问题讨论】:

  • 我遇到了完全相同的问题。你找到解决办法了吗?
  • 哇,这几乎是一年前的事了。请参阅我发布的答案,因为它涉及一些编辑。
  • @GRaecuS 忘记提及你的名字了!

标签: c# php memcached flags collision


【解决方案1】:

所以我最终找到了我的问题的答案。这可能对大家没有帮助,因为我从 Enyim 切换到 BeIT memcached 客户端 (http://code.google.com/p/beitmemcached/)

现在要使 BeIT 客户端与 php 客户端兼容,您必须更改 Serializer.cs 在枚举 SerializedType 中,我将“String”的数量更改为 0,将 ByteArray 的数量更改为 2,这样就得到了:

internal enum SerializedType : ushort
{
    ByteArray   = 2,
    Object      = 1,
    String      = 0, //mod: turned around the numbers for String and ByteArray so it is compatible with php client
    Datetime    = 3,
    ....

我相信我选择了 BeIT,因为我无法找到或弄清楚这些标志在 Enyim 客户端中是如何工作的。但是,如果您了解它的工作原理,我相信您可以以相同的方式更改该客户端

【讨论】:

    【解决方案2】:

    如果我没记错的话,将语言/平台与 memcached 混合是一个坏主意。见another question on similar topic.

    【讨论】:

    • 好吧,我只使用了一个 memcached 服务器。我用 JSON 序列化变量,此外,如果我让两种语言一个接一个地为同一个键设置一个值,我注意到该值发生了变化(通过 telnet 查看它时)。 C# 客户端还可以读取 php 在缓存中设置的任何内容。也许该标志在 php lib 中引起了一些冲突,但如果这是一个问题,我也许可以找到解决方法。
    【解决方案3】:

    为了记录。由于该库是开源的,因此可以进行修改。

    在类 Enyim.Caching.Memcached.DefaultTranscoder 中,改变函数

        public static uint TypeCodeToFlag(TypeCode code)
        {
            return (uint)((int)code | 0x0100);
        }
    

        public static uint TypeCodeToFlag(TypeCode code)
        {
            if (code == TypeCode.String)
            {
                return 0;
            }
            return (uint)((int)code | 0x0100);
        }
    

    274 = 类型代码.String | 0x0100

    因为我不知道 memcache 协议,所以我不知道在做什么。但是php的memcache需要0,所以当定义的变量是字符串时我设置为零。

    ps:beitmemcached 很久没有更新了。

    【讨论】:

      猜你喜欢
      • 2014-01-19
      • 1970-01-01
      • 2010-10-08
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2014-11-18
      相关资源
      最近更新 更多