PHP memcached enyim客户端标志问题
本文关键字:标志 问题 客户端 enyim memcached PHP | 更新日期: 2023-09-27 18:04:12
我正在尝试使用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已经很久没有更新了