PHP Memcached всегда возвращает 0

У меня есть memcache (установлено на php5) и memcached (установлено на php7.2 через libmemcached), оба подключаются к одному и тому же memcached daemon/server.

Memcache::get отлично работает и извлекает данные в соответствии с моими ожиданиями. Но когда я делаю Memcached::get, он всегда возвращает 0.

Я проверил, что у меня отключено сжатие при использовании обоих расширений. Я также пытался переключаться между Memcached::OPT_BINARY_PROTOCOL и memcached, и он по-прежнему дает тот же нулевой результат.

Интересно, что когда я добавляю пару ключ/значение, используя расширение memcached, и извлекаю его, используя тот же ключ, я получаю правильное/правильное значение, которое я добавил.

Теперь я не знаю, в чем может быть причина того, что он не работает с данными, уже хранящимися на сервере memcached.

EDIT 1: я подключился к моему серверу memcached через telnet и убедился, что он действительно имеет значение. Кроме того, я проверил, что код результата, возвращаемый Memcached::getResultCode, не является ошибкой.

РЕДАКТИРОВАНИЕ 2: я, возможно, еще больше сузил его. Я заметил, что когда я сохраняю ["key1" => "value1"] из скрипта memcache-php5, он правильно сохраняет и извлекает данные. Но когда я пытаюсь получить те же данные с помощью скрипта memcached-php7.1, он возвращает 0.

После этого я удалил данные с ключом «key1» с сервера memcached с помощью telnet. Затем я сохранил ["key1" => "value1"] с помощью скрипта memcached-php7.1, и он может правильно получить эти данные. Но при попытке получить его с помощью скрипта memcache-php5 он возвращает тип сериализованных данных "a:1:{s:4:\"key1\";s:6:\"value1\";}" (это вывод json_encoded)

Поэтому для обновления мне, возможно, придется удалить/сбросить все и заново создать записи на сервере memcached, используя расширение memcached.

P.S. : Я знаю разницу между обоими этими расширениями php. Я прочитал все комментарии к этому вопросу, и это не мой дубликат. .


person Abubakkar    schedule 20.02.2018    source источник
comment
Какую ОС вы используете?   -  person Vahe Galstyan    schedule 01.03.2018
comment
убунту, это важно?   -  person Abubakkar    schedule 01.03.2018
comment
Может, в винде у меня с этим много проблем, но в линуксе должно работать четко.   -  person Vahe Galstyan    schedule 01.03.2018
comment
Что ж, со мной это не так, мне, вероятно, придется пойти с тем, что предложил Диого в своем ответе, чего я пытался избежать.   -  person Abubakkar    schedule 01.03.2018


Ответы (1)


Как вы уже знаете, memcache и memcached — это два разных расширения. Несмотря на то, что они используются для одной и той же цели — подключения к серверу кэша памяти — каждый из них сериализует данные по-разному.

Это означает, что вы не можете безопасно переключаться между ними без надлежащей очистки кеша на сервере или независимых экземплярах сервера.

<?php
$memcache = new Memcache;
$memcacheD = new Memcached;
$memcache->addServer($host);
$memcacheD->addServers($servers);

$checks = array(
    123,
    4542.32,
    'a string',
    true,
    array(123, 'string'),
    (object)array('key1' => 'value1'),
);
foreach ($checks as $i => $value) {
    print "Checking WRITE with Memcache\n";
    $key = 'cachetest' . $i;
    $memcache->set($key, $value);
    usleep(100);
    $val = $memcache->get($key);
    $valD = $memcacheD->get($key);
    if ($val !== $valD) {
        print "Not compatible!";
        var_dump(compact('val', 'valD'));
    }

    print "Checking WRITE with MemcacheD\n";
    $key = 'cachetest' . $i;
    $memcacheD->set($key, $value);
    usleep(100);
    $val = $memcache->get($key);
    $valD = $memcacheD->get($key);
    if ($val !== $valD) {
        print "Not compatible!";
        var_dump(compact('val', 'valD'));
    }
}
person Diogo Sgrillo    schedule 27.02.2018