与PHP和Python共享Memcache
我试图在Python和PHP之间共享Memcache密钥。Python编写密钥,PHP读取。我使用的是Cakephp框架、php pecl memcache(不是php pecl memcached)和python memcache all python库 Python:与PHP和Python共享Memcache,php,python,memcached,flags,Php,Python,Memcached,Flags,我试图在Python和PHP之间共享Memcache密钥。Python编写密钥,PHP读取。我使用的是Cakephp框架、php pecl memcache(不是php pecl memcached)和python memcache all python库 Python: mc = memcache.Client( ["127.0.0.1:11211"]) key = "key1" value = 1323779849 mc.set(key, value) PHP: PHP无法
mc = memcache.Client( ["127.0.0.1:11211"])
key = "key1"
value = 1323779849
mc.set(key, value)
PHP:
PHP无法读取变量,我得到了奇怪的“MemcachePool::get()[http://php.net/memcachepool.get]:未能解压缩数据”错误;我怀疑这与每个库中设置不同的memcached标志有关
这就是我telnet到memcached时发生的情况:
Python设置键:
get key1
VALUE key1 1 12
1323779849
.
END
get key1
VALUE key 1 0 12
1323779849
END
PHP设置键:
get key1
VALUE key1 1 12
1323779849
.
END
get key1
VALUE key 1 0 12
1323779849
END
- 有没有一种方法可以覆盖这些标志,只是“做你自己的事”
- 是否有php/python memcache库可以更好地协同工作
- 或者,是否有一种简单的方法可以在python/php之间创建公共内存空间
我在使用PHP和pymemcache时遇到了类似的问题。我用序列化了Python字典,并将其写入memcache。PHP方面也有自己的存储到memcache的方法,PHP和Python编写的memcache值似乎是一样的,但PHP无法正确读取Python的set值,所以这让我很困惑。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()方法使其成为一个数组,它就工作了。我尝试了原始字符串和直整数,两者都不起作用:(还有一件事。在过去,我使用会话和会话cookie在php/python之间进行通信。有一个缺点。这取决于机器,所以如果你有多集群技术,这可能会很糟糕。否则它非常简单。你可以将hdd上的会话保存在文件中,数据可以jsoned作为字符串传输。这不是非常灵活的解决方案n但它曾经对我起过作用。还有一件事,你可以尝试使用cmemache而不是memcache,这可能会有所帮助。但是我怀疑。你可以尝试使用一些快速数据库来进行通信,比如说noSql(Riak、CouchDB等)或者SqlLite.Thank Will,但我所要做的只是共享一个简单的数据类型,可以是int或string,因此不需要序列化、pickle甚至压缩。我宁愿不写入文件,因为这会影响性能。虽然是的,但这会起作用。如果您尝试过整数和字符串,我认为您无法摆脱使用(一致的)序列化。您可能缺少一些要点,memcache有一个压缩和序列化数据的选项(即使只是一个字节)。这更多是供内部使用。我想python API默认情况下是启用压缩的,而PHP API默认情况下没有启用。您没有提到memcache使用的确切API,因此,我想没有人能够真正挖掘文档并提供深入的答案。谢谢,但在这种情况下,它更简单,因为我只是在尝试g要做的是存储一个整数,PHP和Python都没有试图压缩数据。这实际上归结为PHP和Python使用不同的标志来表示相同的内容。我在下面的回答中解释了所有内容。另一件事:我也可以切换到Mysql内存/堆表类型并实现相同的功能。压缩错误是easy以避免使用正确编译和标记的pylibmc。最深入的错误之一是字符串键值。当您使用set()方法时,始终对键名和键值使用str()表示。两者都使用。否则您会发现在实际字符串内容之前有7个字节的垃圾。小心=)