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下通过POST还是GET来传值
Jun 05 PHP
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
Nov 18 PHP
PHP nl2br函数 将换行字符转成 <br>
Aug 21 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
Apr 21 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
May 19 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
Mac系统完美安装PHP7详细教程
Jun 06 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
PHP使用phpunit进行单元测试示例
Sep 23 PHP
php中关于换行的实例写法
Sep 26 PHP
PHP网页缓存技术优点及代码实例
Jul 29 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模板类代码
2008/09/07 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
两种php给图片加水印的实现代码
2020/04/18 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
jQuery之网页换肤实现代码
2011/04/30 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
jQuery实现form表单序列化转换为json对象功能示例
2018/05/23 jQuery
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
vuex入门最详细整理
2020/03/04 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
python正则表达式re之compile函数解析
2017/10/25 Python
python爬虫获取多页天涯帖子
2018/02/23 Python
浅谈python中get pass用法
2019/03/19 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
python实现最大优先队列
2019/08/29 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
python3中sys.argv的实例用法
2020/04/24 Python
Python  word实现读取及导出代码解析
2020/07/09 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
python pip如何手动安装二进制包
2020/09/30 Python
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
师范应届生教师求职信
2013/11/05 职场文书
监督检查工作方案
2014/05/28 职场文书
卢旺达饭店观后感
2015/06/05 职场文书
网络营销实训总结
2015/08/03 职场文书
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers