@nekolyanich

Проблема связи php и python через memcached?

если совершается set из php в memcache то при попытке сделать get по такому ключу из python получаю:
&gt;&gt;&gt; import sys; print('%s %s' % (sys.executable or sys.platform, sys.version))<br/>
/usr/bin/python2.6 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) <br/>
[GCC 4.4.5]<br/>
&gt;&gt;&gt; import memcache<br/>
&gt;&gt;&gt; import binascii<br/>
&gt;&gt;&gt; m=memcache.Client(['127.0.0.1:11211'], debug=0)<br/>
&gt;&gt;&gt; def php_hash(key):<br/>
... return (binascii.crc32(key) &gt;&gt; 16) & 0x7fff<br/>
... <br/>
&gt;&gt;&gt; m.get((php_hash(mfd.php_nexttime), mfd.php_nexttime))<br/>
Traceback (most recent call last):<br/>
 File &quot;&quot;, line 1, in NameError: name 'mfd' is not defined<br/>
&gt;&gt;&gt; m.get((php_hash('mfd.php_nexttime'), 'mfd.php_nexttime'))<br/>
Traceback (most recent call last):<br/>
 File &quot;&quot;, line 1, in  File &quot;/usr/lib/pymodules/python2.6/memcache.py&quot;, line 779, in get<br/>
 return self._get('get', key)<br/>
 File &quot;/usr/lib/pymodules/python2.6/memcache.py&quot;, line 766, in _get<br/>
 value = self._recv_value(server, flags, rlen)<br/>
 File &quot;/usr/lib/pymodules/python2.6/memcache.py&quot;, line 915, in _recv_value<br/>
 return val<br/>
UnboundLocalError: local variable 'val' referenced before assignment<br/>
<br/>
Устал гуглить может кто ни будь сталкивался?
  • Вопрос задан
  • 2843 просмотра
Решения вопроса 1
seriyPS
@seriyPS
Видимо придется залезть вам в исходники питоньего клиента и почикать там все что связано с флагами. Во флагах (768 и 300 например) клиенты сохраняют информацию о том, в каком виде они закодировали (сериализовали) данные. см github.com/memcached/memcached/blob/master/doc/protocol.txt#L155
В вашем случае VALUE mfd.php_nexttime 768 10 флаг это 768 а 10 — длина ответа (10 байт). Только не совсем понял почему у вас для одного и того же ключа разные флаги (ведь там оба раза одно и то же значение было??)

Если вы на обоих концах (php-python) будете использовать одинаковые методы сериализации, посмотрите какими флагами помечает их PHP клиент и подмените в Python клиенте на аналогичные или используйте текстовый флаг по умолчанию. Конкретнее вряд ли подскажу т.к. там уже просто надо в коде ковыряться и править. (см функцию _recv_value(self, server, flags, rlen) в исходниках клиента, можете написать val = buf как вариант для
else:
            val = buf#вот так!!
            self.debuglog("unknown flags on get: %x\n" % flags)
)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
standov
@standov
питон небось пытается десереализовать значение сразу и обламывается — синтаксис сериализатора php ему не знаком… решение запихивать в мемкеш json кодированное значение и в питоне декодировать, ну или любой другой «стандартный формат»
Ответ написан
seriyPS
@seriyPS
Погулял по коду библиотеки… Попробуйте сначала сделать memcache.debug=True и посмотреть что оно в stderr пишет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы