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安全性漫谈
Jun 28 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
Jun 05 PHP
php中rename函数用法分析
Nov 15 PHP
php+mysql数据库实现无限分类的方法
Dec 12 PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 PHP
php微信浏览器分享设置以及回调详解
Aug 01 PHP
PHP简单字符串过滤方法示例
Sep 04 PHP
php传值方式和ajax的验证功能
Mar 27 PHP
分享5个非常有用的Laravel Blade指令
May 30 PHP
PHP实现倒计时功能
Nov 16 PHP
php实现JWT验证的实例教程
Nov 26 PHP
PHP 使用位运算实现四则运算的代码
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
2019年漫画销量排行榜:鬼灭登顶 海贼单卷制霸 尾田盛赞鬼灭
2020/03/08 日漫
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
PHP-redis中文文档介绍
2013/02/07 PHP
PHP转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
2014/06/30 PHP
php实现插入排序
2015/03/29 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
JavaScript中获取元素索引的函数
2010/09/10 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
js判断背景图片是否加载成功使用img的width实现
2013/05/29 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
JS实现的自定义map方法示例
2019/05/17 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
Python Queue模块详细介绍及实例
2016/12/27 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
亚马逊印度站:Amazon.in
2017/10/15 全球购物
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
高中化学教学反思
2014/01/13 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
团代会邀请函
2015/02/02 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书
导游词之晋城蟒河
2019/12/12 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
JavaScript高级程序设计之基本引用类型
2021/11/17 Javascript
Python OpenCV实现图像模板匹配详解
2022/04/07 Python
Fluentd搭建日志收集服务
2022/09/23 Servers