PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别


Posted in PHP onJanuary 27, 2016

•gzencode 默认使用ZLIB_ENCODING_GZIP编码,使用gzip压缩格式,实际上是使用defalte 算法压缩数据,然后加上文件头和adler32校验
•gzdeflate 默认使用ZLIB_ENCODING_RAW编码方式,使用deflate数据压缩算法,实际上是先用 LZ77 压缩,然后用霍夫曼编码压缩
•gzcompress ;默认使用ZLIB_ENCODING_DEFLATE编码,使用zlib压缩格式,实际上是用 deflate 压缩数据,然后加上 zlib 头和 CRC 校验

这三个函数的比较实质上是三种压缩方法:deflate, zlib, gzip的比较。
从性能的维度看:deflate 好于 gzip 好于 zlib
从文本文件默认压缩率压缩后体积的维度看:deflate 好于 zlib 好于 gzip

这三种算法中gzip 、zlib的作者都是Jean-Loup Gailly和 Mark Adler。
这两种算法以及图形格式png,使用的压缩算法却都是deflate算法。
deflate算法是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。
它最初是由Phil Katz为他的PKZIP归档工具第二版所定义的,后来定义在 RFC 1951规范中。

deflate算法的压缩与解压的实现过程可以在压缩库zlib上找到。
PHP的压缩实现依赖于zlib,zlib是一个提供了 deflate, zlib, gzip 压缩方法的函数库。
我们所使用的上面三个函数,将参数中的encoding转为相同,压缩率设置相同,则其最终调用的是同一个函数,效果和性能一样。

PHP的zlib实现是以扩展的方式存在于ext/zlib目录中。通过deflateInit2() + deflate() + deflateEnd()三个函数配合完成压缩功能,inflateInit2() + inflate() + inflateEnd()三个函数配合完成解压功能。压缩最终都是通过php_zlib_encode函数实现调用,除了输入的字符串,压缩率,结果的输出外,不同的入口函数调用参数不同的是其encoding。deflateInit2的第四个参数指定encoding,PHP定义了三个常量:

#define PHP_ZLIB_ENCODING_RAW          -0xf      //deflate -15

#define PHP_ZLIB_ENCODING_GZIP          0x1f      //gzip 15 + 16

#define PHP_ZLIB_ENCODING_DEFLATE     0x0f      // zlib 15

三个函数在调用过程可以直接指定encoding使用其它的算法:

zlib:   ZLIB_ENCODING_DEFLATE 

gzip: ZLIB_ENCODING_GZIP

deflate: ZLIB_ENCODING_RAW

此三个函数是三种算法的简单调用方式,以更好的命名展现。三个函数间可以通过指定相同的encoding达到相同的效果,并且PHP也提供zlib_encode函数作为通用的压缩函数。

参考资料:
http://shouce.3water.com/gzip/rfc-deflate.html
http://www.gzip.org/zlib/rfc-deflate.html

PHP 相关文章推荐
GBK的页面输出JSON格式的php函数
Feb 16 PHP
php操作SVN版本服务器类代码
Nov 27 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
Mar 06 PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 PHP
yii2中使用Active Record模式的方法
Jan 09 PHP
php中的常用魔术方法汇总
Feb 14 PHP
PHP表单数据写入MySQL数据库的代码
May 31 PHP
php多线程并发实现方法
Sep 30 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
PHP封装的非对称加密RSA算法示例
May 28 PHP
PHP下用Swoole实现Actor并发模型的方法
Jun 12 PHP
php use和include区别总结
Oct 13 PHP
PHP文件上传之多文件上传的实现思路
Jan 27 #PHP
PHP内核学习教程之php opcode内核实现
Jan 27 #PHP
PHP编程入门的基本语法知识点总结
Jan 26 #PHP
PHP数组游标实现对数组的各种操作详解
Jan 26 #PHP
PHP面向对象程序设计实例分析
Jan 26 #PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 #PHP
php实现爬取和分析知乎用户数据
Jan 26 #PHP
You might like
ThinkPHP模板中数组循环实例
2014/10/30 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
JS定时关闭窗口的实例
2013/05/22 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
[40:03]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
[01:44]Ti10举办地公布
2019/08/25 DOTA
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
Python接口自动化测试的实现
2020/08/28 Python
科室工作的个人自我评价
2013/10/30 职场文书
荷叶圆圆教学反思
2014/02/01 职场文书
《两个铁球同时着地》教学反思
2014/02/13 职场文书
运动会口号大全
2014/06/07 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
关于实现中国梦的心得体会
2016/01/05 职场文书
详解JS数组方法
2021/11/20 Javascript
Hive导入csv文件示例
2022/06/25 数据库
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技