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 购物车实例(申精)
May 11 PHP
PHP操作数组相关函数
Feb 03 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
php float不四舍五入截取浮点型字符串方法总结
Oct 28 PHP
xss防御之php利用httponly防xss攻击
Mar 21 PHP
PHP中浮点数计算比较及取整不准确的解决方法
Jan 09 PHP
php开发工具有哪五款
Nov 09 PHP
php制作基于xml的RSS订阅源功能示例
Feb 08 PHP
thinkphp下MySQL数据库读写分离代码剖析
Apr 18 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
Sep 26 PHP
PHP类的自动加载机制实现方法分析
Jan 10 PHP
php无限极分类实现方法分析
Jul 04 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文件下载类
2006/12/06 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
关于PHP开发的9条建议
2015/07/27 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
2017/07/13 Javascript
js正则相关知识点专题
2018/05/10 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
python删除文件示例分享
2014/01/28 Python
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
python xml解析实例详解
2016/11/14 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
python打包成so文件过程解析
2019/09/28 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
将n个数按输入顺序的逆序排列,用函数实现
2012/11/14 面试题
行政总监岗位职责
2013/12/05 职场文书
企业管理标语
2014/06/10 职场文书
小学数学课题方案
2014/06/15 职场文书
2014单位领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
mysql insert 存在即不插入语法说明
2022/03/25 MySQL
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记