我正在尝试在 Python 和 PHP 之间共享 Memcache key 。 Python 写入 key ,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 设置 key :
get key1
VALUE key1 1 12
1323779849
.
END
PHP 设置 key :
get key1
VALUE key 1 0 12
1323779849
END
- 有没有办法覆盖这些标志并“做你自己的事”?
- 是否有可以更好地协同工作的 php/python 内存缓存库?
- 或者,是否有一种简单的方法可以在 python/php 之间创建一个公共(public)内存空间?
请您参考如下方法:
终于搞定了。很多东西没有按预期工作。
一个问题是 php 和 python 使用不同的标志来做不同的事情。 在全 python 或全 php 解决方案中不是问题,但对于环境间通信来说是一个真正的问题。一个有用的资源是 http://www.hjp.at/zettel/m/memcached_flags.rxml ,这表明 python-memcache 将长整数标记为“2”,而 php-memcache 无法理解,因此出现了压缩错误。我修改了 python-memcache 以在 set 函数中包含一个“标志覆盖”。这个变量只是强制一个特定的标志,不管 python memcache 认为它应该是什么。这允许我将 Int 从 2 重新标记为 0。我将可能分支当前版本的 python-memcache 并将其提交到 Github。这允许我将 python long int 标志 (2) 强制为 php 可以理解的东西 (0)。
1.3.3 之前的 CakePhp 将所有 key 存储在 memcached 中,并带有一个附加的 key_expires key ,标记为 768,等等。没有这个附加 key ,它无法找到您正在寻找的 key 。值得庆幸的是,这种行为在后来的 Cakephp 版本中被抛弃了(我只是升级到 1.3.13)并且现在运行良好。
