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+MySQL5.0中文乱码解决方法
Nov 20 PHP
php chr() ord()中文截取乱码问题解决方法
Sep 08 PHP
c#中的实现php中的preg_replace
Dec 21 PHP
求PHP数组最大值,最小值的代码
Oct 31 PHP
探讨:如何使用PhpDocumentor生成文档
Jun 25 PHP
解析如何去掉CodeIgniter URL中的index.php
Jun 25 PHP
smarty缓存用法分析
Dec 16 PHP
php面向对象与面向过程两种方法给图片添加文字水印
Aug 26 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 PHP
PHP设计模式之命令模式示例详解
Dec 20 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实现递归无限级分类
2015/10/22 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
jquery 插件开发备注
2010/08/27 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
JS验证图片格式和大小并预览的简单实例
2016/10/11 Javascript
利用python分析access日志的方法
2016/10/26 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
webstorm添加*.vue文件支持
2018/05/08 Javascript
[48:00]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第二场 11.04
2020/11/04 DOTA
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Python卸载模块的方法汇总
2016/06/07 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
python循环输出三角形图案的例子
2019/11/22 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
结合 CSS3 transition transform 实现简单的跑马灯效果的示例
2018/02/07 HTML / CSS
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
自我鉴定书范文
2013/10/02 职场文书
幼儿园安全检查制度
2014/01/30 职场文书
服务承诺书格式
2014/05/21 职场文书
检讨书范文2000字
2015/01/28 职场文书
2015年预算员工作总结
2015/05/14 职场文书
新闻报道稿范文
2015/07/23 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript