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 友好URL的实现(吐血推荐)
Oct 04 PHP
Ajax+PHP边学边练 之五 图片处理
Dec 03 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
PHP获取中英混合字符串长度的方法
Jun 07 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
Jun 19 PHP
php快速查找数据库中恶意代码的方法
Apr 01 PHP
php需登录的文件上传管理系统
Mar 21 PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 PHP
Yii中srbac权限扩展模块工作原理与用法分析
Jul 14 PHP
PHP+Mysql无刷新问答评论系统(源码)
Dec 20 PHP
Yii支持多域名cors原理的实现
Dec 05 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
Oct 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生成带有雪花背景的验证码
2006/10/09 PHP
php 分页原理详解
2009/08/21 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
phpstrom使用xdebug配置方法
2013/12/17 PHP
php分页代码学习示例分享
2014/02/20 PHP
php获取apk包信息的方法
2014/08/15 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
表单元素值获取方式js及java方式的简单实例
2016/10/15 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
JavaScript实现数组降维详解
2017/01/05 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)
2017/09/15 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
Python连接Redis的基本配置方法
2018/09/13 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
python 实现汉诺塔游戏
2020/11/28 Python
如何估计一张表的大小(假设该表中有1万条数据)
2016/03/27 面试题
职工运动会感言
2014/02/07 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis