C# Couchbase php/.Net客户端不兼容问题
我们正在尝试将couchbase客户端用于PHP和.NET。当我们用C#设置一个值,然后用PHP读取它时,我们得到了一个错误。当远程登录到服务器时,我们不会遇到任何问题,也不会读取值。有人知道我们为什么会出错吗 php“get”调用导致以下错误: 警告:Couchbase::get()[Couchbase.get]:无法解压缩第5行D:\inetpub\Webadvisor\its\test\Couchbase.php中的值(错误内容) 错误来自github上的php ext couchbase存储库中的couchbase.c。 C代码:(这个很好用) PHP代码:C# Couchbase php/.Net客户端不兼容问题,c#,php,memcached,couchbase,C#,Php,Memcached,Couchbase,我们正在尝试将couchbase客户端用于PHP和.NET。当我们用C#设置一个值,然后用PHP读取它时,我们得到了一个错误。当远程登录到服务器时,我们不会遇到任何问题,也不会读取值。有人知道我们为什么会出错吗 php“get”调用导致以下错误: 警告:Couchbase::get()[Couchbase.get]:无法解压缩第5行D:\inetpub\Webadvisor\its\test\Couchbase.php中的值(错误内容) 错误来自github上的php ext couchbase
$cb = new Couchbase("127.0.0.1", "", "", "default");
var_dump($cb->get("foo"));
我认为这是因为php扩展在默认情况下使用
php
serializer来无缝地序列化php中更广泛的对象。以下是示例配置的摘录,解释了可用选项:
在您的情况下,我认为您应该使用
json
序列化程序。事实证明,.NET和PHP客户端不兼容的问题归根结底是客户端将memcache标志设置为什么。这些标志用于告诉客户端存储的值的类型。NET将其标志基于Type.GetTypeCode()方法。例如,当.NET客户端写入一个字符串以缓存时,它会将标志设置为274,但是PHP不知道关于.NET键入模式的任何信息,也不知道如何处理该值,因此它会尝试解压缩该值,这会引发一个错误。当PHP将字符串写入缓存时,它会将标志设置为0
我们找到了两种不同的解决方案。第一个更像是一个工作环境。如果将PHP Couchbase选项Couchbase_OPT_IGNOREFLAGS设置为true,它将开始工作
$cb = new Couchbase("127.0.0.1", "", "", "default");
$cb->setOption(COUCHBASE_OPT_IGNOREFLAGS,true);
我们最终使用的第二个解决方案是重载.NET转码器(Enyim.Caching.Memcached.ITranscoder)并将标志设置为与PHP标志匹配
public class PHPTranscoder : ITranscoder
{
...
public static uint TypeCodeToFlag(TypeCode code)
{
switch (code)
{
case TypeCode.String: return 0;
case TypeCode.Int16: return 1;
case TypeCode.Int32: return 1;
case TypeCode.Int64: return 1;
case TypeCode.UInt16: return 1;
case TypeCode.UInt32: return 1;
case TypeCode.UInt64: return 1;
case TypeCode.Decimal: return 2;
case TypeCode.Boolean: return 3;
default: return 0; //default to string
}
// THE FOLLOWING IS COUCHBASE'S ORGINAL CODE
// return (uint)((int)code | 0x0100);
}
...
}
$cb = new Couchbase("127.0.0.1", "", "", "default");
$cb->setOption(COUCHBASE_OPT_IGNOREFLAGS,true);
public class PHPTranscoder : ITranscoder
{
...
public static uint TypeCodeToFlag(TypeCode code)
{
switch (code)
{
case TypeCode.String: return 0;
case TypeCode.Int16: return 1;
case TypeCode.Int32: return 1;
case TypeCode.Int64: return 1;
case TypeCode.UInt16: return 1;
case TypeCode.UInt32: return 1;
case TypeCode.UInt64: return 1;
case TypeCode.Decimal: return 2;
case TypeCode.Boolean: return 3;
default: return 0; //default to string
}
// THE FOLLOWING IS COUCHBASE'S ORGINAL CODE
// return (uint)((int)code | 0x0100);
}
...
}