2013-10-18 65 views
0

我們正在嘗試爲PHP和.NET使用couchbase客戶端。當我們用C#設置一個值時,我們會收到一個錯誤,然後用PHP讀取它。在通過服務器進行通信時,我們沒有任何問題朝向另一個方向或讀取值。有誰知道我們爲什麼會遇到錯誤?Couchbase php/.Net客戶端不兼容問題

PHP的 'GET' 調用導致以下錯誤:

警告:Couchbase ::得到()[couchbase.get]:不能解壓值(不良內容)在d:\的Inetpub \ Webadvisor \其\ test \ couchbase.php on line 5

錯誤來自github上的php-ext-couchbase存儲庫中的couchbase.c。 https://github.com/couchbase/php-ext-couchbase/blob/master/convert.c#L213

C#代碼:(這工作正常)

Couchbase.Configuration.CouchbaseClientConfiguration config = new Couchbase.Configuration.CouchbaseClientConfiguration(); 
config.Urls.Add(new Uri("http://127.0.0.1:8091/pools")); 
CouchbaseClient client = new CouchbaseClient(config); 
client.Store(StoreMode.Set, "foo", "bar"); 
client.Dispose(); 

PHP代碼:

$cb = new Couchbase("127.0.0.1", "", "", "default"); 
var_dump($cb->get("foo")); 

回答

0

事實證明,.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); 
    } 
    ... 
} 
0

我想這是因爲PHP擴展使用php串行器在默認情況下,允許無縫連載更廣PHP中的各種對象。下面是來自例如配置的摘錄,說明可用選項:https://github.com/couchbase/php-ext-couchbase/blob/master/example/couchbase.ini#L44-L52

; Specify the serializer to use to store objects in the Couchbase cluster. 
; 
; Legal values: 
; php  - Use the standard php serializer 
; json  - Use the php JSON encoding 
; json_array - Same as json, but decodes into arrays 
; igbinary - This option is only available if the extension is build 
;    with igbinary support 
couchbase.serializer = php 

在你的情況下,我認爲你應該使用json串代替。