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源码之explode使用说明
Aug 05 PHP
PHP使用数组实现队列
Feb 05 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
Jun 14 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
Aug 15 PHP
PHP获取windows登录用户名的方法
Jun 24 PHP
PHP调用.NET的WebService 简单实例
Mar 27 PHP
php获取、检查类名、函数名、方法名的函数方法
Jun 25 PHP
php上传图片类及用法示例
May 11 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP实现从上往下打印二叉树的方法
Jan 18 PHP
laravel框架中间件简单使用方法示例
Jan 25 PHP
PHP7 参数处理机制修改
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
php字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
JQuery DataTable删除行后的页面更新利用Ajax解决
2013/05/17 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
python实现简单的TCP代理服务器
2014/10/08 Python
Python实现的简单发送邮件脚本分享
2014/11/07 Python
Python日志模块logging简介
2015/04/13 Python
Python虚拟环境Virtualenv使用教程
2015/05/18 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
py-charm延长试用期限实例
2019/12/22 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
美国高级工作服品牌:Carhartt
2018/01/25 全球购物
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
计算机个人求职信范例
2014/01/24 职场文书
初二生物教学反思
2014/02/03 职场文书
纠风工作实施方案
2014/03/15 职场文书
小学作文评语大全
2014/04/21 职场文书
公司股东合作协议书
2014/09/14 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby