pylibmc存储的数据不能在php memcached中解压缩

pylibmc存储的数据不能在php memcached中解压缩,php,python,memcached,zlib,libmemcached,Php,Python,Memcached,Zlib,Libmemcached,我们有一个应用程序,使用python在memcached中存储大量数据。我们在python中使用pylibmc,在php端使用php memcached库。作为总结 pylibmc v.1.2.3 php memcached v.2.0.1 libmemcached v1.0.8 除了开始压缩外,其他一切都很好。这就是python中数据的压缩方式 import pylibmc mem = pylibmc.Client(['10.90.15.104:11211'], binary=True)

我们有一个应用程序,使用python在memcached中存储大量数据。我们在python中使用pylibmc,在php端使用php memcached库。作为总结

  • pylibmc v.1.2.3
  • php memcached v.2.0.1
  • libmemcached v1.0.8
除了开始压缩外,其他一切都很好。这就是python中数据的压缩方式

import pylibmc

mem = pylibmc.Client(['10.90.15.104:11211'], binary=True)
mem.set('foo','this is a rather long string. this is a rather '+
'long string. this is a rather long string. this is a rather' + 
'long string. this is a rather long string', 0, 10)
在telnet中,我们看到一些乱码,这意味着它被压缩了。现在用php阅读它

$memd = new Memcached();
$memd->addServer('10.90.15.104', 11211);
echo $memd->get('foo');
当上面的代码运行时,我们会得到相同的乱码值,这意味着它不会被解压缩。pylibmc正在使用zlib,因此我也相应地将php的压缩类型更改为zlib。还需要进行哪些其他设置?请帮忙

下面是在python pylibmc中设置字符串后memcached的输出,以供进一步参考

get foo
VALUE foo 8 40
x+��,V�D��Ē��"����t�⒢̼t=���g\5#
END
下面是使用PHP的memcached客户端存储的字符串的memcached输出:

get foo
VALUE foo 48 44
�x�+��,V�D��Ē��"����t�⒢̼t=���g\5#
END

正如你所看到的,这里面有点可疑。pylibmc中的压缩大小为40字节,使用php memcached压缩的相同数据为44字节。还请注意,使用pylibmc存储时标记为8,使用php memcached存储时标记为48

我认为您观察到的是memcache本身并没有实现压缩 因此,每个库都以自己的方式进行压缩,只需比较用于指示正在使用压缩的标志

定义为


#define PYLIBMC_FLAG_ZLIB(1我认为您观察到的是memcache本身并没有实现压缩
因此,每个库都以自己的方式进行压缩,只需比较用于指示正在使用压缩的标志

定义为

定义PYLIBMC标志(1Raber

正如你所说,我做了一些改变

  • 将php压缩方法从FASTLZ更改为ZLIB
  • 将pyLibmc标志更改为1Raber

    正如你所说,我做了一些改变

  • 将php压缩方法从FASTLZ更改为ZLIB


  • 将pyLibmc标志更改为1 wow,感谢您的挖掘。但是这些标志的修改会起作用吗?我想说,这也取决于存储的类型,对于像ints这样的简单事情,它应该起作用(前提是您使库同意类型标志,并且如果您将php压缩方法从FASTLZ更改为ZLIB),对于对象,这将是不同的,因为我相信php将它们存储为JSON,python存储为pickleswell,然后(对于字符串)只要统一压缩方法和标志就可以了:)你将是我的救星!!:)好吧,不管出于什么原因,我认为标志是十六进制的,而实际上它们是二进制的,因此,php似乎同时设置了
    MEMC\u VAL\u COMPRESSED
    MEMC\u VAL\u COMPRESSION\u ZLIB
    (如OP中所示),尝试了一下,得到了
    Memcached::get():无法解压缩值
    ,所以这4个字节产生了不同的效果哇,感谢您的挖掘。但是这些标志的修改会起作用吗?我想说,这也取决于存储的类型,对于像ints这样的简单事情,它应该起作用(前提是您将使库同意类型标志,并且如果您将php压缩方法从FASTLZ更改为ZLIB),对于对象,这将是不同的,因为我相信php将它们存储为JSON,python存储为pickleswell,然后(对于字符串)只要统一压缩方法和标志就可以了:)而你将是我的救星!!:)好吧,不管出于什么原因,我认为标志是十六进制的,而实际上它们是二进制的,所以php似乎同时设置了
    MEMC_VAL_COMPRESSED
    MEMC_VAL_COMPRESSION_ZLIB
    (如OP中所示),尝试了一下,得到了
    Memcached::get():无法解压缩值
    ,所以这4个字节会有所不同,我知道很多关于php和它对memcache的支持,什么是uaTestMemcached.php?,还有现在通过python和php存储压缩的东西时标志是什么样子?这里使用的是php测试脚本。下面是在python pylibmc中设置字符串后memcached的输出(在您建议的更改之后)
    get foo
    VALUE foo 8 42
    x+��,v�D��Ē��"����T�⒢̼t=�*�M0似乎您在pylibmc中的更改没有生效,我无法复制,因为php memcached不会为我压缩任何内容(不知道为什么)你需要在php.ini中将memcached.compression\u threshold设置为'10'字节,默认值为2000bytes
    memcached.compression\u threshold=10
    @amolrajoba:我知道这很痛苦。文档中有100字节,但默认值为2000!!:Osorry,我知道很多关于php的知识,以及它对memcache的支持,什么是umestmemcached.php?,还有你怎么做现在,当您存储通过python与php压缩的内容时,这里使用的是php测试脚本。下面是在python pylibmc中设置字符串后(在您建议的更改之后)memcached的输出
    get foo
    VALUE foo 8 42
    x+��,v�D��Ē��"����T�⒢̼t=�*�M0似乎您在pylibmc中的更改没有生效,我无法复制,因为php memcached不会为我压缩任何内容(不知道为什么)您需要在php.ini中将memcached.compression\u threshold设置为'10'字节,默认值为2000bytes
    memcached.compression\u threshold=10
    @amolrajoba:我知道这很痛苦。文档中给出了100字节,但默认值为2000!!:O
    #define PYLIBMC_FLAG_ZLIB (1 << 5)
    
    Warning: Memcached::get(): unknown payload type in uaTestMemcached.php on line 5
    
    bool(false)