我正在尝试在Python和PHP之间共享一个Memcache密钥。 Python写密钥,PHP读取它。我正在使用Cakephp框架,php-pecl-memcache(不是php-pecl-memcached)和python-memcache都是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
答案 0 :(得分:3)
终于开始工作了。很多东西没有按预期工作。
一个问题是php和python使用不同的标志来做不同的事情。 在all-python或all-php解决方案中不是问题,但对于环境间通信来说是一个真正的问题。一个有用的资源是http://www.hjp.at/zettel/m/memcached_flags.rxml,它表明python-memcache将长整数标记为'2',php-memcache不理解,因此压缩错误。我修改了python-memcache以在set函数中包含'flag-override'。这个变量只是强制一个特定的标志,而不管python memcache认为它应该是什么。这允许我将Int从2重新标记为0.我将分析当前版本的python-memcache并将其提交给Github。这允许我强制python long int flag(2)到php会理解的东西(0)。
1.3.3之前的CakePhp将所有密钥存储在memcached中,并带有额外的key_expires密钥,标记为768等等。如果没有这个附加密钥,它就找不到您要查找的密钥。值得庆幸的是,这种行为在后来的Cakephp版本中被转储(我只是升级到1.3.13)并且它现在运行良好。
答案 1 :(得分:0)
当你通过python memcached放置东西时,它可能会被腌制。所以PHP无法解开它。我会尝试使用某种非常基本的类型,也许是ctypes?也许原始字符串?
答案 2 :(得分:0)
使用PHP和pymemcache时,我遇到了类似的问题。我使用https://www.php2python.com/wiki/function.serialize/序列化了Python字典,并将其写入了内存缓存。 PHP方面也有它自己的存储到memcache中的方式,并且PHP和Python编写的memcache值似乎相同,但是PHP无法正确读取Python设置值,因此,我很困惑。 PHP将其读取为字符串,无法反序列化/将其转换为数组。然后,我必须使用netcat读取memcache值,如下所示:
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方面,如果我得到的是字符串“ a:{s:6 ...”而不是数组,则使用PHP的unserialize()方法将其设置为数组即可。