2011-07-29 80 views
1

我想與php(memcached)和C#(enyim)客戶端一起使用memcached。 我有一個場景,我想在CAS中的CAS值。爲此,我正在使用以下代碼:php memcached enyim客戶端標誌問題

$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的值相同時,它出錯了。

$entries = $memcached->get($theKey, null, $cas); 

即:

PHP Warning: Memcached::get(): could not uncompress value in ... at line ... 

而作爲一個無限循環發生的結果 PHP提供給了一個警告。

現在我試圖通過telnet從memcached服務器獲取密鑰,數據就在那裏。 在PHP中,我也可以設置到這個鍵沒有問題。

我注意到一兩件事:PHP客戶端已設置的東西后,該標誌爲0 現在的C#客戶端已CAS'd值後,該標誌是274 是否有對PHP LIB一些標誌碰撞繼續?或者是別的什麼?

如果有人能幫我解決這個問題,我會非常樂意!

lordstyx

[編輯]

井然後。由於這個問題沒有得到答案,讓我以不同的方式說明問題。 有沒有辦法阻止C#客戶端設置標誌274?

+0

我有完全相同的問題。你找到了解決方案嗎? – GRaecuS

+0

這是近一年前的事了。看到我發佈的答案,因爲它涉及一些編輯。 – lordstyx

+0

@GRaecuS忘了提及你的名字! – lordstyx

回答

2

所以我最終找到了我的問題的答案。它可能不會幫助你們所有人,因爲我從Enyim切換到BeIT memcached客戶端(http://code.google.com/p/beitmemcached/)

現在讓BeIT客戶端與php客戶端兼容你必須改變Serializer.cs 在枚舉SerializedType我改「字符串」的數量爲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, 
    .... 

我相信我與貝特去,因爲我無法找到或者弄清楚Enyim客戶端的標誌是如何工作的。如果你明白它是如何工作的,我相信你可以用相同的方式更換客戶端

+0

謝謝先生。這也解決了我的問題! –

0

如果我沒有錯,用memcached混合語言/平臺是一個壞主意。見another question on similar topic.

+0

那麼,我只使用一個memcached服務器。我用JSON序列化變量,而且,如果我有兩種語言將一個值依次設置爲相同的密鑰,我注意到值發生了變化(通過telnet查看時)。 C#客戶端也可以讀取任何在緩存中設置的php。也許這個標誌在php lib中引起了一些衝突,但是如果這是一個問題,我可能會找到一個解決方法。 – lordstyx

0

備案。由於該庫是開源的,因此可以修改它。

在類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 =類型碼。字符串| 0x0100

由於我不知道memcache協議,那麼我不知道最近做什麼。然而,php的memcache需要0,所以當定義的變量是一個字符串時,我設置爲零。

ps:beitmemcached已經很久沒有更新了。