pylibmc存储的数据无法在php memcached中解压缩

时间:2012-12-17 10:40:55

标签: 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)
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!

2 个答案:

答案 0 :(得分:3)

我认为你观察到的是因为memcache本身没有实现压缩 所以每个库都以自己的方式完成它,只需比较用于表示正在使用压缩的标志

pylibmc

定义

#define PYLIBMC_FLAG_ZLIB (1 << 3) (所以这是标志== 8)

php-memcached

#define MEMC_VAL_COMPRESSED (1<<4)

#define MEMC_VAL_COMPRESSION_ZLIB (1<<5)

#define MEMC_VAL_COMPRESSION_FASTLZ (1<<6)

所以我认为除非你愿意修改其中一个库以使其标志与另一个一致,否则就没有出路了

修改 好的,所以这里是一个小补丁,为pylibmc和php-memcached同步带来压缩支持。见我的github fork of pylibmc

大胖交战 - 它只适用于字符串,所以如果你想存储对象,你必须自己进行de / serialization(JSON)。

答案 1 :(得分:1)

Raber,

正如你所说我做了改变

  1. 将PHP压缩方法从FASTLZ更改为ZLIB
  2. 将pyLibmc标志更改为1&lt;&lt; 5.在_pylibmcmodule.h文件中重新安装pylibmc

    #define PYLIBMC_FLAG_ZLIB (1 << 5)
    
  3. 这些正确的变化吗? 还有什么需要做的吗? 因为它不起作用,得到以下错误

    Warning: Memcached::get(): unknown payload type in uaTestMemcached.php on line 5
    
    bool(false)