я имею 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. Я прочитал все комментарии этот вопрос и это не мой дубликат.
Как ты уже знаешь, 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'));
}
}
Других решений пока нет …