PHP memcached enyim客户端标志问题


php memcached enyim client flag problem

我正在尝试使用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库上是否有一些标志冲突?还是其他原因?

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

lordstyx

[编辑]

那么。既然这个问题没有答案我换个说法。有没有办法阻止c#客户端设置标志274?

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

现在,要使BeIT客户端与php客户端兼容,您必须更改Serializer.cs在enum 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客户端的标志是如何工作的。如果你知道它是如何工作的,我相信你可以用同样的方式改变这个客户端

如果我没有错的话,将语言/平台与memcached混合是一个坏主意。参考类似主题的另一个问题

记录。因为这个库是开源的,所以可以修改。

在类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 = TypeCode。String | 0x0100

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

ps: beitmemcached已经很久没有更新了