php memcached проблема флага клиента enyim - PullRequest
1 голос
/ 30 июля 2011

Я пытаюсь использовать memcached с клиентом php (memcached) и C # (enyim).У меня есть сценарий, где я хочу, чтобы CAS значение в php.Для этого я использую следующий код:

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

Для начала все работает хорошо.Но затем, когда CAS-клиент C # имеет то же значение, это идет не так.Php выдает предупреждение по адресу:

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

, а именно:

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

И в результате происходит бесконечный цикл.

Теперь я попытался получить ключ отсервер memcached через telnet и данные были тут же.В php я также могу установить SET для этого ключа без проблем.

Я заметил одну вещь: после того, как у php-клиента было что-то SET, флаг был равен 0. Теперь после того, как у клиента C # есть значение CAS, значение CAS, флаг был 274. Есть ли какое-то столкновение флагов на php lib?Или это что-то еще?

Если кто-нибудь может помочь мне решить эту проблему, я буду благодарен!

lordstyx

[EDIT]

Ну тогда,Поскольку на этот вопрос нет ответа, позвольте мне сказать по-другому.Есть ли способ остановить клиент C # от установки флага 274?

Ответы [ 3 ]

2 голосов
/ 07 сентября 2012

Так что в итоге я нашел ответ на свою проблему. Это может не всем вам помочь, потому что я перешел с Enyim на клиент Meccache BeIT (http://code.google.com/p/beitmemcached/)

Теперь, чтобы сделать клиент BeIT совместимым с клиентом php, вам нужно изменить Serializer.cs В перечислении 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. Если вы понимаете, как это работает, я уверен, что вы можете изменить этого клиента таким же образом

0 голосов
/ 20 сентября 2017

Для записи.Поскольку библиотека имеет открытый исходный код, ее можно изменить.

В классе 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, то я не знаю, что делает.Тем не менее, memcache php требует 0, поэтому я устанавливаю в ноль, когда определенная переменная является строкой.

ps: beitmemcached долгое время не обновлялся.

0 голосов
/ 30 июля 2011

Если я не ошибаюсь, смешивать языки / платформы с memcached - плохая идея. См. другой вопрос по аналогичной теме.

...