PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别_php技巧

•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.jb51.net/gzip/rfc-deflate.html
http://www.gzip.org/zlib/rfc-deflate.html

时间: 2024-09-19 08:18:04

PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别_php技巧的相关文章

PHP中压缩函数gzencode、gzdeflate和gzcompress使用

gzencode 默认使用ZLIB_ENCODING_GZIP编码,使用gzip压缩格式,实际上是使用defalte 算法压缩数据,然后加上文件头和adler32校验 gzdeflate 默认使用ZLIB_ENCODING_RAW编码方式,使用deflate数据压缩算法,实际上是先用 LZ77 压缩,然后用霍夫曼编码压缩 gzcompress :默认使用ZLIB_ENCODING_DEFLATE编码,使用zlib压缩格式,实际上是用 deflate 压缩数据,然后加上 zlib 头和 CRC 校

php字符串压缩方法比较

php 提供的字符串压缩方法有 1.gzcompress - Compress a string This function compress the given string using the ZLIB data format. 2.gzencode - Create a gzip compressed string This function returns a compressed version of the input data  compatible with the output

php字符串压缩方法比较示例

 php 提供的字符串压缩方法有很多,下面为大家比较下php字符串压缩方法,感兴趣的朋友可以参考下 php 提供的字符串压缩方法有    1.gzcompress - Compress a string    This function compress the given string using the ZLIB data format.    2.gzencode - Create a gzip compressed string    This function returns a co

php 字符串压缩方法比较示例_php技巧

php 提供的字符串压缩方法有 1.gzcompress - Compress a string This function compress the given string using the ZLIB data format. 2.gzencode - Create a gzip compressed string This function returns a compressed version of the input data compatible with the output

用PHP控制用户的浏览器--ob*函数的使用说明_php技巧

用PHP控制用户的浏览器--ob*函数的使用 /google 的广告条--> Output Control 函数可以让你自由控制脚本中数据的输出.它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况.输出控制函数不对使用 header() 或 setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用. 我们先举一个简单的例子,让大家对Output Control有一个大致的印象:Example 1. <?php ob_st

PHP中的gzcompress、gzdeflate、gzencode函数详解_php实例

PHP中存在一组看起来很像的压缩解压函数: 压缩函数:gzcompress gzdeflate gzencode 解压函数:gzuncompress gzinflate gzdecode gzdecode是PHP 5.4.0之后才加入的,使用的时候要注意兼容性问题. 这几个函数都以gz开头,让人想到gzip压缩,而光看函数名却又看不出它们之间的区别,只能查文档. gzcompress gzdeflate gzencode函数的区别在于它们压缩的数据格式不同: gzcompress使用的是ZLIB

压缩函数库:gzcompress

gzcompress (PHP4 >= 4.0.1) gzcompress ---&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 压缩一字符串 语法 : string gzcompress (string data [, int level]) 说明 : 此函数传回一个输入值data的gzip压缩版本,失败则传回false.非必需参数level可以给予0到9,0表示无压缩,9表示最大的压缩. 参考 : gz

如何用java读取php的gzencode函数输出的压缩字符

问题描述 如何用java读取php的gzencode函数输出的压缩字符 输入的字符串为php的gzencode压缩的字符串,可以用gzdecode解开,但是用java的java.util.zip.GZIPInputStream读入字符串时,总是提示: java.util.zip.ZipException: Not in GZIP format 希望有经验的朋友帮我解答一下,我的代码如下: JAVA import java.io.ByteArrayInputStream; import java.

压缩函数库:gzuncompress

gzuncompress (PHP4 >= 4.0.1) gzuncompress ---&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 将压缩的字符串解压缩 语法 : string gzcompress (string data [, int length]) 说明 : 此函数取gzcompress( )所压缩的资料data,并且传回原本未压缩的资料,发生错误则传回false.如果解压缩的资料大于参数le