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中操作Excel实例代码
Apr 29 PHP
探讨file_get_contents与curl效率及稳定性的分析
Jun 06 PHP
解析PHP跨站刷票的实现代码
Jun 18 PHP
php中实现可以返回多个值的函数实例
Mar 21 PHP
前端必学之PHP语法基础
Jan 01 PHP
PHP下载远程图片并保存到本地方法总结
Jan 22 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
Feb 20 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
使用composer 安装 laravel框架的方法图文详解
Aug 02 PHP
PHP实现与java 通信的插件使用教程
Aug 11 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 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和javascript常用正则表达式及用法实例
2014/07/01 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
onkeydown事件解决按回车键直接提交数据的需求
2013/04/11 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
js实现增加数字显示的环形进度条效果
2017/02/05 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
python初学之用户登录的实现过程(实例讲解)
2017/12/23 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
解决使用PyCharm时无法启动控制台的问题
2019/01/19 Python
python实现剪切功能
2019/01/23 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
Python的log日志功能及设置方法
2019/07/11 Python
python生成器推导式用法简单示例
2019/10/08 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
英国香水店:The Perfume Shop
2017/03/27 全球购物
数据库笔试题
2013/05/09 面试题
《世界多美呀》教学反思
2014/03/02 职场文书
员工工作表现评语
2014/04/26 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
村官个人总结范文
2015/03/03 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers