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 相关文章推荐
PHP新手上路(九)
Oct 09 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
PHP通用检测函数集合
Feb 08 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 PHP
php对二维数组按指定键值key排序示例代码
Nov 26 PHP
php中用memcached实现页面防刷新功能
Aug 19 PHP
Zend Framework入门教程之Zend_Session会话操作详解
Dec 08 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
总结PHP内存释放以及垃圾回收
Mar 29 PHP
php redis setnx分布式锁简单原理解析
Oct 23 PHP
PHP中多字节字符串操作实例详解
Aug 23 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
PHP实时显示输出
2008/10/02 PHP
php报表之jpgraph柱状图实例代码
2011/08/22 PHP
jquery对元素拖动排序示例
2014/01/16 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
深入理解JavaScript 参数按值传递
2017/05/24 Javascript
Easyui在treegrid添加控件的实现方法
2017/06/23 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
python3中的md5加密实例
2018/05/29 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
python内存管理机制原理详解
2019/08/12 Python
python无序链表删除重复项的方法
2020/01/17 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
selenium携带cookies模拟登陆CSDN的实现
2021/01/19 Python
美国中小型企业领先的办公家具供应商:Office Designs
2016/11/26 全球购物
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
工作说明书范文
2014/05/07 职场文书
电气自动化求职信
2014/06/24 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
幼儿园父亲节活动总结
2015/02/12 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
公司奖励通知
2015/04/21 职场文书
运动员代表致辞
2015/07/29 职场文书