Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Couchbase php/.Net客户端不兼容问题_C#_Php_Memcached_Couchbase - Fatal编程技术网

C# Couchbase php/.Net客户端不兼容问题

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

我们正在尝试将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代码:

$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);
    }
    ...
}