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

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

时间:2023-03-29 14:14:53 PHP

终于到了PHP的拿手好戏。我们学习了PHP中Bzip2、LZF、Phar和rar等压缩相关扩展的使用,但它们要么太冷门,要么功能不支持太多。而Zip是PHP中函数支持最多的一种流行的压缩格式,或者说是一种通用的压缩格式。当然,这也主要是因为Zip也是Linux环境下事实上的通用压缩格式。安装对于PHP,Zip扩展已经集成在PHP安装包中。配置时直接加上--with-zip即可。如果在安装的时候没有添加这个参数,我们也可以在源码包中添加。在ext/zip下找到源码,然后通过扩展安装的方式安装。创建一个存档$zip=newZipArchive();$filename='./test_zip.zip';if($zip->open($filename,ZIPARCHIVE::CREATE)!==TRUE){exit('cannotopen'.$filename.'\n');}//添加文本类型文件$zip->addFromString('testfile1.txt'.time(),"#1");$zip->addFromString('testfile2.txt'.time(),"#2");//添加现有文件$zip->addFile('rar.php','newrar.php');echo$zip->numFiles,PHP_EOL;//文件数量echo$zip->status,PHP_EOL;//压缩包状态$zip->close();//使用操作系统解压查看//#unzip-ltest_zip.zip//Archive:test_zip.zip//LengthDateTimeName//------------------------------//207-08-202008:57testfile1.txt1594169845//207-08-202008:57testfile2.txt1594169845//217807-07-202008:55newrar2.php//----------------//21823个文件前学习到的rar扩展无法打包文件或创建文件新的压缩包,但是Zip一上来,我们学到的就是新建一个压缩包。实例化ZipArchive对象后,我们可以使用open()函数打开或创建压缩文件。接下来,我们使用了两种添加内容的方法。addFromString()是添加一个文本类型的文件,即将一段文本转换成文本文件保存在这个压缩包中。此外,我们使用addFile()将外部文件添加到这个压缩包中。numFiles和status属性分别可以查看压缩包文件的文件个数和当前压缩包的状态信息。最后直接用close()关闭句柄即可。这样,就创建了一个简单的Zip存档文件。我们可以直接使用操作系统的unzip命令来查看压缩包的内容。读取压缩包内容和信息$zip=newZipArchive();$zip->open('./test_zip.zip');print_r($zip);//压缩包信息//ZipArchive对象//(//[status]=>0//[statusSys]=>0//[numFiles]=>40//[filename]=>/data/www/blog/test_zip.zip//[comment]=>//)var_dump($zip);//object(ZipArchive)#2(5){//["status"]=>//int(0)//["statusSys"]=>//int(0)//["numFiles"]=>//int(40)//["filename"]=>//string(27)"/data/www/blog/test_zip.zip"//["comment"]=>//string(0)""//}echo$zip->numFiles,PHP_EOL;echo$zip->status,PHP_EOL;echo$zip->statusSys,PHP_EOL;echo$zip->filename,PHP_EOL;echo$zip->comment,PHP_EOL;echo$zip->count(),PHP_EOL;for($i=0;$i<$zip->numFiles;$i++){echo“索引:$i\n”;//打印每个文件实体信息print_r($zip->statIndex($i));//index:0//数组//(//[name]=>testfile1.txt1594169845//[index]=>0//[crc]=>2930664868//[size]=>2//[mtime]=>1594169844//[comp_size]=>2//[comp_method]=>0//[encryption_method]=>0//)//......$entry=$zip->statIndex($i);if($entry['name']=='newrar.php'){//只解压newrar.php文件到指定目录$zip->extractTo('./test_zip_single',$entry['name']);}}//修改压缩包中的文件名$zip->renameName('newrar.php','newrar2.php');print_r($zip->getFromIndex(2));//获取第二个文件的内容print_r($zip->getFromName('newrar2.php'));//获取指定文件名的文件内容$zip->extractTo('./test_zip');//将整个压缩包解压到指定目录$zip->close();其实读取也是一样的步骤,实例化一个ZipArchive类,然后open()打开一个压缩包文件句柄,然后就可以直接输出压缩包的一些属性信息了。我们可以通过statIndex()方法遍历并获取每个文件实体的信息。这里要注意statIndex()获取的是文件的信息,不是文件的内容。当然我们也可以直接通过getFromIndex()或者getFromName()获取指定的文件。使用renameName()直接重命名压缩包内的文件,使用extractTo()将指定文件或整个压缩包解压到指定目录。如果extractTo()方法的第二个参数指定了内容,则只解压指定的文件。压缩目录、设置指令、流式和伪协议方式读取文件由于是压缩包工具,所以最常用的方法就是直接打包多个文件或目录。同时还有很多压缩包,可以设置一些指令,密码等等。另外,我们还可以通过专属的zip://伪协议直接获取压缩包中某个文件的内容。这些函数在PHP的Zip扩展中可以非常简单方便的使用。压缩目录//压缩目录$zip=newZipArchive();$zip->open('./test_zip2.zip',ZIPARCHIVE::CREATE);$zip->addFile('rar.php','newrar.php');$zip->addGlob('./test_zip/*.{php,txt}',GLOB_BRACE,['add_path'=>'new_path/']);直接使用addGlob可以帮我们完成一个文件目录下所有文件内容的打包。同时它的第三个参数也可以指定这些文件在压缩包内的路径地址。设置描述和密码//设置注释和密码$zip->setArchiveComment('ThisisrarComment!');$zip->setPassword('123');$zip->close();//使用操作系统unzip查看//#unzip-ltest_zip2.zip//Archive:test_zip2.zip//ThisisrarComment!//LengthDateTimeName//---------------------------//217807-07-202008:55newrar.php//217807-08-202010:36new_path/./test_zip/newrar.php//217807-08-202010:36new_path/./test_zip/newrar2.php//----------------//65343个文件压缩包设置说明、注释和密码为所有现成的功能方法直接使用。我们可以再次通过操作系统的解压命令查看这个压缩包的注释信息和打包目录的内容。原来测试的test_zip/目录下的内容放在了new_path/目录下,这是我们自定义的一个压缩包的内部路径地址。stream,伪协议方式读取文件//stream,伪协议方式读取压缩包内容$zip=newZipArchive();$zip->open('./test_zip2.zip');//获取文件流$fp=$zip->getStream('newrar.php');while(!feof($fp)){echofread($fp,2);}fclose($fp);//使用伪协议$fp=fopen('zip://'.dirname(__FILE__).'/test_zip2.zip#newrar.php','r');while(!feof($fp)){echofread($fp,2);}fclose($fp);//file_get_contents使用伪协议echofile_get_contents('zip://'.dirname(__FILE__).'/test_zip2.zip#newrar.php');//直接使用伪协议将文件拷贝出来copy('zip://'.dirname(__FILE__).'/test_zip2.zip#newrar.php','./newrar2.php');首先,我们通过getStream()方法直接获取压缩包中某个文件的流,该方法是几乎所有压缩类扩展都提供的读取文件的方式。下面的方法使用zip://伪协议直接使用fopen()和file_get_contents()函数读取压缩包内的一个文件。既然有了这么方便的伪协议,我们想简单的获取并解压某个文件就变得非常容易了,只需要使用copy()函数将文件复制出来即可。综上所述,是不是感觉比rar的操作强大多了?据说这是PHP支持的通用压缩格式,所以功能当然会丰富很多,还有很多功能和方法我们没有一一列举。如果你把它们都列出来,你还不如自己阅读手册。下面通过一些简单的例子,让大家看看这种扩展函数的操作,让大家在选择业务模型的时候,可以快速的想到我们PHP已经提供的这些现成的扩展。需要了解Zip其他内容的同学可以到最下方的链接直接进入说明书参考。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84zip%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.zip.php各媒体平台均可搜索【硬核项目经理】