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 相关文章推荐
基于文本的访客签到簿
Oct 09 PHP
PHP的面试题集,附我的答案和分析(一)
Nov 19 PHP
php格式化工具Beautify PHP小小BUG
Apr 24 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
May 02 PHP
PHP通过session id 实现session共享和登录验证的代码
Jun 03 PHP
PHP三元运算的2种写法代码实例
May 12 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
Oct 01 PHP
php中Ctype函数用法详解
Dec 09 PHP
非常全面的php日期时间运算汇总
Nov 04 PHP
PHP以json或xml格式返回请求数据的方法
May 31 PHP
PHP+redis实现微博的推模型案例分析
Jul 10 PHP
imagettftext() 失效,不起作用
Mar 09 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函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
Ajax基础知识详解
2017/02/17 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
vue axios 简单封装以及思考
2018/10/09 Javascript
Electron中实现大文件上传和断点续传功能
2018/10/28 Javascript
python对DICOM图像的读取方法详解
2017/07/17 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
2017/11/11 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
利用Python如何生成便签图片详解
2018/07/09 Python
Python Opencv任意形状目标检测并绘制框图
2019/07/23 Python
python3.7 的新特性详解
2019/07/25 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
python 递归相关知识总结
2021/03/03 Python
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
一道输出判断型Java面试题
2014/10/01 面试题
校运会入场式解说词
2014/02/10 职场文书
幼儿园毕业园长感言
2014/02/24 职场文书
个人授权委托书
2014/04/03 职场文书
三方协议书范本
2014/04/22 职场文书
学习十八大演讲稿
2014/09/15 职场文书
求职自荐信怎么写
2015/03/04 职场文书
2015年实习单位评语
2015/03/25 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书
Memcached介绍及php-memcache扩展安装
2021/04/01 PHP
Python中Cookies导出某站用户数据的方法
2021/05/17 Python