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

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

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

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

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

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

РЕДАКТИРОВАТЬ 1 Я сделал telnet с моим сервером memcached и проверил, действительно ли он имеет значение. Кроме того, я проверил код результата, возвращенный 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.

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

6

Решение

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

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

<?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'));
}
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]