Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与PHP和Python共享Memcache_Php_Python_Memcached_Flags - Fatal编程技术网

与PHP和Python共享Memcache

与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无法

我试图在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无法读取变量,我得到了奇怪的“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之间创建公共内存空间

当您通过python memcached放置某些内容时,它可能已被酸洗。因此PHP无法解除它的绑定。我会尝试使用一些非常基本的类型,也许是ctypes?也许是粗线

终于成功了。很多东西没有按预期工作

  • 一个问题是php和python使用不同的标志来做不同的事情。 在全python或全php解决方案中,这不是问题,但对于环境间通信来说,这是一个真正的问题。一个有用的资源是,它显示python memcache将长整数标记为“2”,这是php memcache无法理解的,因此出现了压缩错误。我修改了python memcache,在set函数中包含一个“标志覆盖”。这个变量只是强制一个特定的标志,而不管python memcache认为它应该是什么。这允许我将Int从2重新标记为0。我将对当前版本的python memcache进行分支,并将其提交给Github。这允许我强制python长int标志(2)为php可以理解的内容(0)

  • CakePhp 1.3.3之前的版本将所有密钥存储在memcached中,并带有一个附加密钥,标记为768等。如果没有这个附加密钥,它将无法找到您要查找的密钥。谢天谢地,这种行为在后来的Cakephp版本中被抛弃了(我只是升级到了1.3.13),现在它运行良好


  • 我在使用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个字节的垃圾。小心=)