gzip和zlib的关系

这两天做一个日志上报SDK,需要与logstash直接通讯。

因为日志是批量上报的,很多类似于时间、应用名、日志级别的内容在每一行日志都会重复,所以我们协商采用gzip压缩,logstash自带插件支持。

结果打开php.net官方手册,发现zlib库里有好几套压缩/解压缩函数,到底哪一套才能与java适配呢?

其实还是对gzip体系了解不清楚的原因,所以打开维基百科gzip:

zlib是DEFLATE算法的实现库,它的API同时支持gzip文件格式以及一个简化的数据流格式。zlib数据流格式、DEFLATE以及gzip文件格式均已被分别标准化为 RFC 1950RFC 1951RFC 1952

这里有2个概念:

  1. zlib是gz系列压缩算法的实现库。
  2. zlib库支持3种压缩算法,包括:zlib数据流格式(zlib自创的)、deflate、gzip格式。

zlib数据流格式,在PHP中对应方法:gzcompressgzuncompress,底层都是调用zlib库。

deflate是什么呢?

gzip的基础是DEFLATE,DEFLATE是LZ77哈夫曼编码的一个组合体。

看的出来,是一个压缩算法,也是gzip算法的基础。

deflate在PHP中对应方法:gzinflategzdeflate

那么gzip和deflate是什么关系呢?

gzip文件格式说明:

  • 10字节的头,包含幻数、版本号以及时间戳

  • 可选的扩展头,如原文件名

  • 文件体,包括DEFLATE压缩的数据

  • 8字节的尾注,包括CRC-32校验和以及未压缩的原始数据长度

显然,gzip会用到deflate算法压缩数据,但是还会添加一些其他的信息到输出结果中。

gzip在PHP中对应方法:gzencodegzdecode

关于gzip的来龙去脉,大家 理解了吗?

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~