使用PHP和Python共享Memcache

时间:2011-12-13 13:51:42

标签: php python memcached flags

我正在尝试在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
  • 有没有办法覆盖这些标志,只是“做你自己的事情”?
  • 有没有更好地一起玩的php / python memcache库?
  • 或者,是否有一种简单的方法可以在python / php之间创建公共内存空间?

3 个答案:

答案 0 :(得分:3)

终于开始工作了。很多东西没有按预期工作。

  1. 一个问题是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)。

  2. 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()方法将其设置为数组即可。