当前位置: 首页 > 后端技术 > PHP

PHP的zlib压缩工具扩展包学习

时间:2023-03-29 14:34:23 PHP

终于到了我们压缩相关扩展的最后一篇了。最后,我们要学习的也是Linux下非常常用的一种压缩格式:.gz压缩扩展名。zlib扩展作为PHP的内置扩展,和zip一样,是和PHP安装包一起发布的,所以我们在编译的时候直接加上--with-zlib即可,如果找不到对应的包的话,使用yum安装相应的包。创建压缩包//创建压缩包$zp=gzopen('./gztest.gz',"w9");gzwrite($zp,"Onlytest,test,test,test,test,test!\n");gzclose($zp);压缩包的创建非常简单,但是在PHP的这个扩展中,只能使用gzwrite()来创建这种类型字符串的压缩包,有些目录或者文件是不能直接打包的。压缩包创建成功后,我们就可以使用系统的tar命令来解压或者查看文件了。读取压缩包内容//读取压缩包$zp=gzopen('./gztest.gz',"r");echogzread($zp,3);gzpassthru($zp);//输出gz文件指针所有剩余数据//Onlytest,test,test,test,test,test!echoPHP_EOL;gzpassthru($zp);//gzrewind($zp);//返回gz指针的游标到初始位置gzpassthru($zp);//Onlytest,test,test,test,test,test!echoPHP_EOL;gzclose($zp);读取操作其实很简单,直接使用gzpassthru()输出当前压缩包内容,直接打印出来。当然,它也是以类似文件指针的形式输出的,所以如果我们输出一次,就必须使用gzrewind()将指针的光标恢复到句柄原来的位置。对于zlib压缩包,我们还有很多其他的方式来读取文件内容。//读取压缩包2$gz=gzopen('./gztest.gz','r');while(!gzeof($gz)){echogzgetc($gz);}gzclose($gz);//只test,test,test,test,test,test!echoPHP_EOL;//读取压缩包三个echoreadgzfile("./gztest.gz");//只测试,测试,测试,测试,测试,测试!echoPHP_EOL;//读取压缩包4print_r(gzfile("./gztest.gz"));//Array//(//[0]=>只有测试,测试,测试,测试,测试,测试!//)echoPHP_EOL;这里一口气提供了三种阅读方式。首先当然是我们最熟悉的文件操作形式的读取,使用zlib提供的gzeof()和gzgetc()函数。除了gzgetc()之外,还提供了gzgets()和gzgetss(),分别是HTML格式的逐行读取和逐行读取。其次,我们可以使用readgzfile()直接读取整个压缩文件的内容,甚至gzopen()也可以保存下来,类似的还有gzfile()函数,这个函数和readgzfile()的区别在于读取内容以数组的形式返回,这对于多文件归档更有用。gzip压缩类型由于zlib的压缩格式是.gz类型,而且只能以字符串的形式进行压缩,想必很多朋友会有疑惑。它与gzip有什么关系?其实zlib除了作为压缩打包工具,还可以作为gzip工具应用到我们的服务器上。当然,现在大多数情况下我们只需要开启Nginx或者Apache的gzip压缩功能就可以了,不需要去PHP中处理。但是,作为一个合格的PHP程序员,我们还是需要学习相关的操作函数,说不定哪天就会用到。//压缩类型及相关操作//gzcompress默认使用ZLIB_ENCODING_DEFLATE编码,使用zlib压缩格式,实际使用deflate压缩数据,然后添加zlib头和CRC校验$compressed=gzcompress('Compressme',9);echo$compressed;//x?s?-(J-.V?M??echoPHP_EOL;echogzuncompress($compressed);//压缩meechoPHP_EOL;//gzencode默认使用ZLIB_ENCODING_GZIP编码,使用gzip压缩格式,其实就是用defalte算法压缩数据,然后加上文件头和adler32校验$compressed=gzencode('Compressme',9);echo$compressed;//s?-(J-.V?M?jM4echoPHP_EOL;echogzdecode($compressed);//压缩meechoPHP_EOL;//gzdeflate默认使用ZLIB_ENCODING_RAW编码方式,使用deflate数据压缩算法,实际是先使用LZ77压缩,再使用Huffman编码进行compress$compressed=gzdeflate('Compressme',9);echo$compressed;//s?-(J-.V?MechoPHP_EOL;echogzinflate($compressed);//压缩meechoPHP_EOL;其实就是这样注释里已经写的很清楚了,不仅是PHP,Nginx也提供了这三种编码格式,我们可以从浏览器中看到curr使用的是哪种压缩编码格式ently访问了网站。比如我们访问PHP官网返回的:从性能上看:deflate比gzip比zlib好,从压缩文本文件体积的维度上用默认压缩率:deflate比zlib好zlib优于gzip。也就是说,deflate格式在性能和压缩率上都优于gzip,两者都是现在更好的选择。当然,这么好的格式对CPU硬件性能的影响还不清楚。毕竟我们没有大的功能页面来测试,至少对于普通的网站页面来说,是绰绰有余了。另外,和其他压缩工具一样,我们可以为可以对字符串进行编码的工具扩展一个应用场景,即数据加密能力。这个在之前Bzip2和LZF相关的文章中都有提到,这里不再赘述。最后,我们还有一个通用函数,可以通过预定义的常量直接操作这三种编码和解码。//通用压缩函数$compressed=zlib_encode('Compressme',ZLIB_ENCODING_GZIP,9);echo$compressed;//ZLIB_ENCODING_RAW:s?-(J-.V?M//ZLIB_ENCODING_DEFLATE:x?s?-(J-.V?M??//ZLIB_ENCODING_GZIP:s?-(J-.V?M?jM4echoPHP_EOL;echozlib_get_coding_type();echoPHP_EOL;echozlib_decode($compressed);//压缩meechoPHP_EOL;zlib_encode()函数的第二个参数是指定编码类型,这里zlib扩展有为我们准备了三种常量:ZLIB_ENCODING_RAW、ZLIB_ENCODING_DEFLATE、ZLIB_ENCODING_GZIP。而解压zlib_decode()不需要再指定,它会自动选择对应的编码格式直接根据文件头解码内容。增量压缩操作函数在PHP7中,zlib扩展增加了一个操作函数,可用于增量压缩编码,即可以不使用对象句柄,接下来使用函数直接添加内容。//PHP7新增增量压缩运算函数$deflateContext=deflate_init(ZLIB_ENCODING_GZIP);$compressed=deflate_add($deflateContext,"数据压缩",ZLIB_NO_FLUSH);$compressed.=deflate_add($deflateContext,",更多数据",ZLIB_NO_FLUSH);$compressed.=deflate_add($deflateContext,",继续添加数据!",ZLIB_FINISH);//ZLIB_FINISHterminateecho$compressed,PHP_EOL;//{6uó?uO????Y?~Ogue?[??.??//?>潽??????~?U?h?9$inflateContext=inflate_init(ZLIB_ENCODING_GZIP);$uncompressed=inflate_add($inflateContext,$compressed,ZLIB_NO_FLUSH);$uncompressed.=inflate_add($inflateContext,NULL,ZLIB_FINISH);echo$uncompressed;//数据压缩,更多数据,继续添加更多数据!如示例所示,deflate_add()用于向编码文件增量添加内容,当flag为ZLIB_FINISH时,写入操作完成。deflate_init()和inflate_init()分别是编码和解码对应的初始化操作。小结关于压缩解压相关的扩展,我们介绍了Bzip2、LZF、Phar、rar、zip、zlib等官方扩展。在实际生产中,我们会经常用到zip和zlib。当然对于其他的格式也有一定的学习和了解,剩下的就是我们在使用的时候再进行深入的研究。这一系列的内容让我对这些压缩格式有了更深入的了解,希望大家能从中受益。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84zlib%E5%8E%8B%E7%BC%A9%E5%B7%A5%E5%85%B7%E6%89%A9%E5%B1%95%E5%8C%85%E5%AD%A6%E4%B9%A0.php参考文档:https://www.php.net/manual/zh/book.zlib.phphttps://www.php.cn/php-weizijiaocheng-377246.html各媒体平台均可搜索【硬核项目经理】