В последнее время многие команды в компании обновили php 7. В настоящее время только memcached является расширением, которое поддерживает php 7 для чтения mc. Однако многие проекты в компании совместно используют кластер MC для доступа к данным сеанса пользователя, которые записываются в виде массивов при входе в систему и естественным образом считываются в виде массивов при входе в систему. Но теперь для чтения можно использовать только memcached. Но, насколько я знаю, чтение данных массива несовместимо, поэтому я хочу выяснить, почему.
Убедитесь, что расширения Memcache и расширения memcached несовместимы со сценариями тестирования массивов данных для чтения и записи:
addServer('10.199.189.129', 11511);
$key = 'testString';
$mc->set($key, 'test success');
var_dump($mc->get($key));
$mc2 = new memcached;
$mc2->addServer('10.199.189.129', 11511);
var_dump($mc2->get($key));
echo "========== test array ============\n";
$key2 = 'testArray';
$mc->set($key2, [1,2,3]);
var_dump($mc->get($key2));
var_dump($mc2->get($key2));Результаты внедрения:
➜ ~ php /apps/dat/test.php
========== test string ============
string(12) "test success"
string(12) "test success"
========== test array ============
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
int(0)Судя по результатам, это подтверждает наше предыдущее утверждение.
Поскольку строка не имеет проблем, проблема заключается в формате массива. Таким образом, есть подозрение, что массив имеет разные методы сериализации, когда он хранится в mc. Затем были проведены дальнейшие тесты: написание тестовых сценариев
addServer('10.199.189.129', 11511);
$mc2 = new memcached;
$mc2->addServer('10.199.189.129', 11511);
$key2 = 'testArray1';
$key3 = 'testArray2';
$mc->set($key2, [1,2,3]);
$mc2->set($key3, [1,2,3]);
var_dump($mc->get($key2));
var_dump($mc2->get($key3));Результаты внедрения:
➜ ~ php /apps/dat/test.php
========== test array ============
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }Затем подключитесь непосредственно к MC для просмотра
➜ ~ telnet 10.199.189.129 11511
Trying 10.199.189.129...
Connected to 10.199.189.129
Escape character is '^]'.
get testArray1
VALUE testArray1 1 30
a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}
END
get testArray2
VALUE testArray2 4 30
a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}
ENDИз результатов мы можем заключить, что результаты memcached и memcached, записанные в MC, одинаковы, то есть наше предположение неверно. Сериализация двух значений одинакова, но разница в том, что флаг значений отличается. Когда Memcache хранит данные массива, falg равен 1, а memcached равен 4. Мы знаем, что флаг MC median предоставляется пользователям для настройки и различной обработки, когда его легко прочитать снова. Но почему у них разные определения флага? Имея это в виду, попробуйте найти причину, прочитав исходный код двух расширений.
memcache
php_memcache.h:
#define MMC_SERIALIZED 1 #define MMC_COMPRESSED 2
memcached
php_memcached.c
#define MEMC_VAL_IS_STRING 0 #define MEMC_VAL_IS_LONG 1 #define MEMC_VAL_IS_DOUBLE 2 #define MEMC_VAL_IS_BOOL 3 #define MEMC_VAL_IS_SERIALIZED 4 #define MEMC_VAL_IS_IGBINARY 5 #define MEMC_VAL_IS_JSON 6 #define MEMC_VAL_IS_MSGPACK 7
После прочтения исходного кода обнаруживается, что memcached определяет флаг массива array как 1, в то время как memcached определяет строковые, длинные, двойные и другие типы данных, чтобы подробно различать значения PHP, хранящиеся в MC. То есть, когда вы используете memcache, запустите
addServer('10.199.189.129', 11511);
$mc->set('123',1);
var_dump($mc->get('123'));Результаты внедрения заключаются в следующем:
string(1) "1"
Вы явно сохраняете ключ со значением 1, но считываете его как строку. И когда вы используете memcached, запустите
addServer('10.199.189.129', 11511);
$mc->set('123',1);
var_dump($mc->get('123'));Результаты внедрения заключаются в следующем:
int(1)
Несовместимость между расширениями Memcache и расширениями memcached при чтении и записи данных массива обусловлена тем фактом, что memcached определяет идентификаторы различных типов данных для детального разделения типов данных и что идентификаторы массивов несовместимы с идентификаторами массивов, определенных memcached. Чтобы гарантировать, что данные, записанные непосредственно расширениями Memcache и расширениями memcached, могут быть прочитаны друг от друга, MC может быть записан только в строковом формате. После этого исследования я также понял, что многие memcached лучше, чем memcached. Я верю, что с ростом популярности php 7 memcached будет устранен историей.
Воспроизведено от: Автора: Хорошо, адрес этой статьи: [http://www.akayzhang.com/arti…