0

以下代码

$memcached = new Memcached();

$memcached->addServer('127.0.0.1', 11211);

$data = json_encode(array(
        'string1' => md5(time()),
        'string2' => md5(time())
));

var_dump($memcached->set('foo', $data, 300));

工作得很好

# telnet 127.0.0.1 11211
# get foo
VALUE foo 0 91
{"string1":"884e036fd865cac1ef26b5f7a920c2c2","string2":"884e036fd865cac1ef26b5f7a920c2c2"}

但是当我添加第三行时

$data = json_encode(array(
        'string1' => md5(time()),
        'string2' => md5(time()),
        'string3' => md5(time())
));

var_dump($memcached->set('foo', $data, 300));

它产生以下

# get foo
VALUE foo 16 63
x«V*.)ÊÌK7T²RJ322J11KL6M4I4OM¶°H57·4716I5Oµ0NSÒ*6"E±11krW&z

我猜 memcached 正在以某种方式压缩该值,但为什么它不在 get 时恢复它呢?

知道如何解决吗?

4

2 回答 2

3

是的,因为cli并且php正在使用不同的选项

 Memcached::OPT_COMPRESSION is true by default 

来自 PHP 文档

启用或禁用有效负载压缩。启用后,超过某个阈值(当前为 100 字节)的项目值将在存储期间被压缩,并在检索期间透明地解压缩。

内存缓存::设置

该值可以是除资源之外的任何有效 PHP 类型,因为它们不能以序列化形式表示。如果打开Memcached::OPT_COMPRESSION选项,序列化的值也会在存储前被压缩。

它在特定长度后压缩数据......这就是为什么当您尝试从 telnet 获取数据时,您看不到它,json而是compressed version

于 2013-05-28T22:08:01.903 回答
1

根据来源:https ://github.com/php-memcached-dev/php-memcached/blob/master/php_memcached.c#L2918压缩可以是fastlz或者zlib

它的值由memcached.compression_type配置指令指定(https://github.com/php-memcached-dev/php-memcached/blob/master/php_memcached.c#L298

http://www.php.net/manual/en/memcached.configuration.php#ini.memcached.compression-type

于 2013-05-28T22:53:38.757 回答