我正在尝试在 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 memcache 库?
- 或者,有没有一种简单的方法可以在 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 的当前版本进行 prob 分支并将其提交到 Github。这允许我将 python long int 标志 (2) 强制设置为 php 可以理解的值 (0)。
CakePhp 1.3.3 之前的版本将所有 key 存储在 memcached 中,并附加一个 key_expires 键,标记为 768 等。如果没有这个附加 key ,它将无法找到您要查找的 key 。值得庆幸的是,这种行为在后来的 Cakephp 版本中被转储了(我只是升级到 1.3.13),现在运行良好。
关于php - 与 PHP 和 Python 共享 Memcache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8490312/