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中使用PDF文档功能
Oct 09 PHP
php比较多维数组中值的大小排序实现代码
Sep 08 PHP
php中opendir函数用法实例
Nov 15 PHP
PHP实现通用alert函数的方法
Mar 11 PHP
PHP学习笔记(三):数据类型转换与常量介绍
Apr 17 PHP
一个PHP实现的轻量级简单爬虫
Jul 08 PHP
PHP实现生成带背景的图形验证码功能
Oct 03 PHP
php输出含有“#”字符串的方法
Jan 18 PHP
PHP实现限制IP访问及提交次数的方法详解
Jul 17 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
Feb 15 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 PHP
PHP实现随机发放扑克牌
Apr 21 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 FTP类的详解
2013/06/13 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
JavaScript十大取整方法实例教程
2020/12/03 Javascript
python遍历类中所有成员的方法
2015/03/18 Python
Python实现递归遍历文件夹并删除文件
2016/04/18 Python
独特的python循环语句
2016/11/20 Python
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
让IE支持HTML5的方法
2012/12/11 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
Missguided美国官网:英国时尚品牌
2018/01/18 全球购物
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
技术总监个人的自我评价范文
2013/12/18 职场文书
《山谷中的谜底》教学反思
2014/04/26 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
爱心捐助活动总结
2015/05/09 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
python中opencv实现图片文本倾斜校正
2021/06/11 Python
关于Python中*args和**kwargs的深入理解
2021/08/07 Python