CleverCode最近在查看资料时,发现一种写入Memcache时,先采用gzcompress()压缩后在写入。这种做法到底好不好,我在这里分析一些,与大家一起探讨一下。
当我们说到压缩,我们可能会想到文件压缩,其实,字符串也是可以压缩的。PHP提供了。gzcompress()和gzuncompress()函数。同时,你还可以使用gzencode()和gzdecode()函数来压缩,只不用其用了不同的压缩算法。
这里使用gzcompress()和gzuncompress()函数。
<?php /** * testInfo.php * * php压缩效率分析 * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/6/30, by CleverCode, Create * */ $string = "CleverCode是一名PHP工程师,他只想把自己一点点的智慧分享给大家! 他的博客地址:http://blog.csdn.net/CleverCode。 他的微博地址:http://weibo.com/CleverCode。 他推荐的博客专栏: 《设计模式之PHP项目应用》:http://blog.csdn.net/column/details/phpusedesignpattern.html。 《Linux常用软件安装与配置》:http://blog.csdn.net/column/details/linuxsoftwareinstall.html。 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies elit lacus quis ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam a nunc. In id magna pellentesque tellus posuere adipiscing. Sed non mi metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendum id euismod urna sodales."; //压缩 $compressed = gzcompress($string); echo "Original size: ". strlen($string)."\n"; /* 输出原始大小 Original size: 1157 */ echo "Compressed size: ". strlen($compressed)."\n"; /* 输出压缩后的大小 Compressed size: 680 */ // 解压缩 $original = gzuncompress($compressed); ?>
根据上面的压缩方式,可以看到节省了内存约50%。那么在我们内存不充足的情况下。我们在写入Memcache时可以先压缩,然后再放入到内存中。
<?php /** * testMemcache.php * * 写入Memcache * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/6/30, by CleverCode, Create * */ /** * 写缓存 * * @param string $key key * @param mixed $data 数据 * @param int $expire 有效时间 * @return null */ function mc_set($key = '', $data = '', $expire = 3600){ // 序列化 $string = serialize($data); // 压缩 $compressed = gzcompress($string); // 写入缓存 $memcache_obj = new Memcache(); $memcache_obj->connect('memcache_host', 11211); $memcache_obj->set($key, $compressed, 0, $expire); } /** * 读缓存 * * @param string $key * @return mixed */ function mc_get($key = ''){ // 写入缓存 $memcache_obj = new Memcache(); /* connect to memcached server */ $memcache_obj->connect('memcache_host', 11211); // 读取 $compressed = $memcache_obj->get($key); // 解压 $string = gzuncompress($compressed); // 反序例化 $data = unserialize($string); return $data; } ?>
Memcache函数set时候有一个参数,可以指定是否压缩。如下。
bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )
Memcache::set()向key存储一个元素值为 var。参数expire是以秒为单位的失效时间, 如果设置为0表明该元素永不过期(但是它可能会因为为了给其他项分配空间而被删除)。如果你希望存储的元素 经过压缩(使用zlib),你可以设置flag的值为MEMCACHE_COMPRESSED。
样例:
<?php /** * testMemcache.php * * 写入Memcache * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/6/30, by CleverCode, Create * */ /* OO API */ $memcache_obj = new Memcache(); /* connect to memcached server */ $memcache_obj->connect('memcache_host', 11211); /* * 设置'var_key'对应值,使用即时压缩 * 失效时间为50秒 */ $memcache_obj->set('var_key', 'some really big variable', MEMCACHE_COMPRESSED, 50); echo $memcache_obj->get('var_key'); ?>