Совместное использование Memcache с PHP и Python - PullRequest
2 голосов
/ 13 декабря 2011

Я пытаюсь разделить ключ Memcache между Python и PHP. Python пишет ключ, а PHP читает его. Я использую фреймворк Cakephp с php-pecl-memcache (не php-pecl-memcached) и python-memcache all из библиотеки python.

Python:

  mc = memcache.Client( ["127.0.0.1:11211"])
  key = "key1"
  value = 1323779849
  mc.set(key, value)

PHP:

  echo Cache::read('key1', 'memcached');

PHP не может прочитать переменную, я получаю странные ошибки "MemcachePool :: get () [http://php.net/memcachepool.get]: Не удалось распаковать данные"; Я подозреваю, что это связано с флагами memcached, которые устанавливаются по-разному в каждой библиотеке.

Вот что происходит, когда я telnet к memcached:

Python устанавливает ключ:

 get key1
 VALUE key1 1 12
 1323779849
 .
 END

PHP устанавливает ключ:

 get key1
 VALUE key 1 0 12
 1323779849
 END
  • Есть ли способ переопределить эти флаги и просто "сделать свое дело"?
  • Существуют ли библиотеки php / python memcache, которые лучше играют вместе?
  • В качестве альтернативы, есть ли простой способ создать общее пространство памяти между python / php?

Ответы [ 3 ]

3 голосов
/ 14 декабря 2011

Наконец получил его на работу. Многие вещи не работали, как ожидалось.

  1. Одна проблема заключается в том, что php и python используют разные флаги для выполнения разных задач. Не проблема в решении для всех python или всех php, но для межсредовой связи - настоящая проблема. Полезным ресурсом является http://www.hjp.at/zettel/m/memcached_flags.rxml,, который показывает, что python-memcache помечает длинное целое число как '2', что php-memcache не понимает, следовательно, ошибка сжатия . Я исправил python-memcache, добавив флаг-override в функцию set. Эта переменная просто устанавливает конкретный флаг независимо от того, какой pyc memcache думает, что это должно быть. Это позволило мне повторно пометить Int с 2 на 0. Я попытаюсь разветвить текущую версию python-memcache и отправить ее на Github. Это позволило мне заставить флаг python long int (2) понять что-то, что php будет понимать (0).

  2. CakePhp до 1.3.3 сохраняет все ключи в memcached с дополнительным ключом key_expires, помеченным как 768 и т. Д., И т. Д. Без этого дополнительного ключа он не может найти ключ, который вы ищете. К счастью, это поведение было сброшено в более поздней версии Cakephp (я просто обновился до 1.3.13), и теперь оно работает хорошо.

0 голосов
/ 11 июля 2019

У меня была похожая проблема с использованием PHP и pymemcache. Я сериализовал словарь Python с https://www.php2python.com/wiki/function.serialize/ и записал это в memcache. У стороны PHP также был свой собственный способ хранения в memcache, и значения memcache, написанные PHP и Python, казались одинаковыми, но PHP не мог правильно прочитать значение набора Python, поэтому это меня сильно озадачило. PHP читает его как строку, будучи не в состоянии десериализовать его / преобразовать в массив. Затем я прочитал значения memcache, используя netcat, например:

echo -e 'get my-key\r' | nc 192.168.1.17 11211

Возвращенное значение Python:

VALUE my-key 0 1460

, в то время как PHP установил значение:

VALUE my-key 1 1460

Не зная, как обращаться с этими флагами, я просто использовал это - на стороне PHP, если я получил String "a: {s: 6 ..." вместо Array, я использовал PHP-метод unserialize () для сделать его массивом, и это сработало.

0 голосов
/ 13 декабря 2011

Когда вы кладете что-то через python memcached, это, вероятно, засолено.Таким образом, PHP не может распаковать его.Я бы попробовал использовать какой-то очень простой тип, может быть, ctypes?Может быть, сырые строки?

...