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 05 PHP
PHP 文件类型判断代码
Mar 13 PHP
php将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
PHP 命令行参数详解及应用
May 18 PHP
php 函数中使用static的说明
Jun 01 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
Jun 21 PHP
关于使用coreseek并为其做分页的介绍
Jun 21 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
Nov 14 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
浅谈php的优缺点
Jul 14 PHP
PHP中使用OpenSSL生成证书及加密解密
Feb 05 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
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
多文件上载系统完整版
2006/10/09 PHP
escape unescape的php下的实现方法
2007/04/27 PHP
php str_pad 函数使用详解
2009/01/13 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
php中fsockopen用法实例
2015/01/05 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
Python虚拟环境Virtualenv使用教程
2015/05/18 Python
python迭代dict的key和value的方法
2018/07/06 Python
Python logging模块用法示例
2018/08/28 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
香港演唱会订票网站:StubHub香港
2019/10/10 全球购物
企划经理的岗位职责
2013/11/17 职场文书
《美丽的小路》教学反思
2014/02/26 职场文书
房产转让协议书
2014/04/11 职场文书
条幅标语大全
2014/06/20 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
Python django中如何使用restful框架
2021/06/23 Python
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python