与PHP和Python共享Memcache


Sharing Memcache with PHP and Python

我试图在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]: Failed to uncompress data"错误;我怀疑这与每个库中设置不同的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之间的公共内存空间?

终于成功了。很多东西都不像预期的那样好用。

  1. 一个问题是php和python使用不同的标志来做不同的事情。在全python或全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长int标志(2)强制设置为php可以理解的值(0)。

  2. CakePhp在1.3.3之前将所有密钥存储在memcached中,并附加一个key_expires密钥,标记为768,等等。如果没有这个额外的键,它就无法找到您正在寻找的键。值得庆幸的是,这种行为在后来的Cakephp版本中被抛弃了(我只是升级到1.3.13),现在它工作得很好。

当您通过python memcached放入某些内容时,它可能被pickle了。PHP无法解pickle它。我会尝试使用一些非常基本的类型,比如ctypes?也许是原始琴弦?

我有一个类似的问题,使用PHP和pymemcache。我用https://www.php2python.com/wiki/function.serialize/序列化Python字典,并将其写入memcache。PHP端也有自己的memcache存储方式,PHP和Python写的memcache值看起来是一样的,但是PHP不能正确读取Python的集合值,这让我很困惑。PHP将其作为字符串读取,无法将其反序列化/转换为数组。然后我使用netcat读取memcache值,如下所示:

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

Python set返回值:

VALUE my-key 0 1460

,而PHP set value有:

VALUE my-key 1 1460

不知道如何处理这些标志,我简单地使用这个-在PHP端,如果我得到一个字符串"a:{s:6…"而不是一个数组,我使用PHP的unserialize()方法使它成为一个数组,它工作