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
php循环输出数据库内容的代码
May 24 PHP
php文件缓存类汇总
Nov 21 PHP
php上传文件常见问题总结
Feb 03 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
Mar 01 PHP
Laravel与CI框架中截取字符串函数
May 08 PHP
php执行多个存储过程的方法【基于thinkPHP】
Nov 08 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
PHP中cookie知识点学习
May 06 PHP
PHP+RabbitMQ实现消息队列的完整代码
Mar 20 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
Apr 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创建PDF中文文档
2006/10/09 PHP
一个用于网络的工具函数库
2006/10/09 PHP
PHP模块化安装教程
2016/06/01 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
js静态作用域的功能。
2006/12/25 Javascript
javascript XML数据显示为HTML一例
2008/12/23 Javascript
js Event对象的5种坐标
2011/09/12 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
Javascript监视变量变化的方法
2015/06/09 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
[01:13:17]Secret vs NB 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python 创建子进程模块subprocess详解
2015/04/08 Python
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
Python WEB应用部署的实现方法
2019/01/02 Python
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
LUISAVIAROMA中国官网:时尚奢侈品牌购物网站
2020/11/01 全球购物
代理班主任的自我评价
2014/02/04 职场文书
优秀毕业生自我鉴定
2014/02/11 职场文书
《争吵》教学反思
2014/02/15 职场文书
2014年清明节寄语
2014/04/03 职场文书
毕业生个人自荐书
2015/03/05 职场文书
幽灵公主观后感
2015/06/09 职场文书
大学生实习证明
2015/06/16 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
Python基于Opencv识别两张相似图片
2021/04/25 Python