总算到了 PHP 的拿手好戏上场了,前面我们学习过 Bzip2 、 LZF 、 Phar 和 rar 这些压缩相关扩展在 PHP 中的使用,不过它们要么是太冷门,要么就是很多功能不支持。而 Zip 则是在 PHP 中得到最大幅度功能支持的热门压缩格式,或者说是通用常见的一种压缩格式。当然,也主要得益于 Zip 也是事实上的 Linux 环境中的通用压缩格式。

安装

对于 PHP 来说,Zip 扩展已经集成在了 PHP 的安装包中,在 Configure 的时候可以直接加上 --with-zip ,如果在安装的时候没有加上这个参数,我们也可以在源码包的 ext/zip 下找到源码,然后通过扩展安装的方式进行安装。

创建一个压缩包

$zip = new ZipArchive();
$filename = './test_zip.zip'; if($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE){
exit('cannot open ' . $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 查看
// # unzip -l test_zip.zip
// Archive: test_zip.zip
// Length Date Time Name
// --------- ---------- ----- ----
// 2 07-08-2020 08:57 testfile1.txt1594169845
// 2 07-08-2020 08:57 testfile2.txt1594169845
// 2178 07-07-2020 08:55 newrar2.php
// --------- -------
// 2182 3 files

之前学习过的 rar 扩展是无法打包文件或者创建新的压缩包的,而 Zip 一上来我们就学习的是创建一个新的压缩包。通过实例化一个 ZipArchive 对象后,我们就可以使用 open() 函数打开或创建一个压缩包文件。接着,我们使用了两种添加内容的方式。addFromString() 是加入文字类型的文件,也就是将一段文字转换成文本文件保存在这个压缩包中。另外,我们通过 addFile() 来将外部的文件加入到这个压缩包中。

numFiles 和 status 属性可以分别查看到压缩包文件里面的文件数量及当前这个压缩包的状态信息。最后直接使用 close() 关闭句柄即可。这样,一个简单的 Zip 压缩包文件就创建完成了。我们可以直接使用操作系统的 unzip 命令来查看压缩包的内容。

读取压缩包内容及信息

$zip = new ZipArchive();
$zip->open('./test_zip.zip');
print_r($zip); // 压缩包信息
// ZipArchive Object
// (
// [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 "index: $i\n";
// 打印每个文件实体信息
print_r($zip->statIndex($i));
// index: 0
// Array
// (
// [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 = new ZipArchive();
$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('This is rar Comment!');
$zip->setPassword('123');
$zip->close(); // 使用操作系统 unzip 查看
// # unzip -l test_zip2.zip
// Archive: test_zip2.zip
// This is rar Comment!
// Length Date Time Name
// --------- ---------- ----- ----
// 2178 07-07-2020 08:55 newrar.php
// 2178 07-08-2020 10:36 new_path/./test_zip/newrar.php
// 2178 07-08-2020 10:36 new_path/./test_zip/newrar2.php
// --------- -------
// 6534 3 files

设置压缩包的说明注释以及密码都是有现成的函数方法直接使用的。我们再次通过操作系统的 unzip 命令,就可以查看到这个压缩包的注释信息以及打包的目录内容。本来测试的 test_zip/ 目录下的内容被放在了 new_path/ 目录下,这就是我们自定的一个压缩包内部的路径地址。

流、伪协议方式读取文件

// 流、伪协议方法读取压缩包内容
$zip = new ZipArchive();
$zip->open('./test_zip2.zip'); // 获取文件流
$fp = $zip->getStream('newrar.php');
while(!feof($fp)){
echo fread($fp, 2);
}
fclose($fp); // 使用伪协议
$fp = fopen('zip://' . dirname(__FILE__) . '/test_zip2.zip#newrar.php', 'r');
while(!feof($fp)){
echo fread($fp, 2);
}
fclose($fp); // file_get_contents 使用伪协议
echo file_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

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

PHP的zip压缩工具扩展包学习的更多相关文章

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

    总算到了我们压缩相关扩展的最后一篇文章了,最后我们要学习的也是 Linux 下非常常用的一种压缩格式:.gz 的压缩扩展.作为 PHP 的自带扩展,就像 zip 一样,zlib 扩展是随着 PHP 的 ...

  2. PHP的rar解压读取扩展包学习

    作为压缩解压方面的扩展学习,两大王牌压缩格式 rar 和 zip 一直是计算机领域的压缩终结者.rar 格式的压缩包是 Windows 系统中有接近统治地位的存在,今天我们学习的 PHP 扩展就是针对 ...

  3. Python框架学习之Flask中的常用扩展包

    Flask框架是一个扩展性非常强的框架,所以导致它有非常多的扩展包.这些扩展包的功能都很强大.本节主要汇总一些常用的扩展包. 一. Flask-Script pip install flask-scr ...

  4. 【转】下载量最高的 100 个 Laravel 扩展包推荐

    说明 Laravel 另一个令人喜欢的地方,是拥有活跃的开发者社区,而活跃的开发者社区带来的,是繁华的扩展包生态. 本文对 Packagist 上打了 Laravel 标签 的扩展包进行整理,截止到现 ...

  5. Python之扩展包安装

    读者朋友,在比较新的版本(Python 2 >=2.7.9 or Python 3 >=3.4)中,pip或者easy_install 扩展包命令已经默认安装(可查看   你的安装目录\p ...

  6. 【C#】依赖于SharpZipLib的Zip压缩工具类

    上班第二天下班,课外作业,实现一个ZIP压缩的工具类.本来想用Package,但是写完了才发现不能解压其他工具压缩的zip包,比较麻烦,因此本工具类依赖了第三方的库(SharpZipLib  vers ...

  7. R语言扩展包dplyr——数据清洗和整理

    R语言扩展包dplyr——数据清洗和整理 标签: 数据R语言数据清洗数据整理 2015-01-22 18:04 7357人阅读 评论(0) 收藏 举报  分类: R Programming(11)  ...

  8. laravel中使用的PDF扩展包——laravel-dompdf和laravel-snappy

    这两天项目中需要将HTML页面转换为PDF文件方便打印,我在网上搜了很多资料.先后尝试了laravel-dompdf和laravel-snappy两种扩展包,个人感觉laravel-snappy比较好 ...

  9. zip压缩工具 tar打包 打包并压缩

    6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩 zip压缩工具 xz,bzip2,gzip都不支持压缩目录 zip可以压缩目录 压缩文件 zip  2.txt.zip  2.txt [ ...

随机推荐

  1. 【笔记】初探KNN算法(3)

    KNN算法(3) 测试算法的目的就是为了帮助我们选择一个更好的模型 训练数据集,测试数据集方面 一般来说,我们训练得到的模型直接在真实的环境中使用 这就导致了一些问题 如果模型很差,未经改进就应用在现 ...

  2. 自定义流式布局:ViewGroup的测量与布局

    目录 1.View生命周期以及View层级 1.1.View生命周期 1.2.View层级 2.View测量与MeasureSpec类 2.1.MeasureSpec类 2.2.父View的限制 :测 ...

  3. Elasticsearch BM25相关度算法超详细解释

    Photo by Pixabay from Pexels 前言:日常在使用Elasticsearch的搜索业务中多少会出现几次 "为什么这个Doc分数要比那个要稍微低一点?".&q ...

  4. kvm虚拟化的qcow2磁盘格式的扩容方法

    第一种:增加一块磁盘而另磁盘空间增大 1).先进入kvm环境,创建一块硬盘:qemu-img create -f qcow2 /home/tianke/test.qcow2 40G 2).再给增加的硬 ...

  5. 从net到java:MyBatis快速入门

    第一:这不是net与java的对比,只是我学习java相关知识梳理的笔记. 第二:这也没有否认net,只是现在的工作需要自己会java. 第三:这不深入.只是我看了些官网和网上的视频,算是入门的总结. ...

  6. open62541(opcua)传输延迟探索小记

    缘起 将open62541作为中间件使用代替自定义数据的RPC,client通过订阅valueChange来接收数据.使用时发现有一些问题: 前后两次产生的数据相同时,不会触发valueChange ...

  7. 【C#】GC和析构函数(Finalize 方法)

    析构函数: (来自百度百科)析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数.析构函数往往用来做"清理善后&quo ...

  8. SpringBoot2.0整合Quartz定时任务(持久化到数据库,更为简单的方式)

    1. pom文件添加依赖 <dependencies> <dependency> <groupId>org.springframework.boot</gro ...

  9. Gradient checking

    所需文件:本地下载 Gradient Checking Welcome to the final assignment for this week! In this assignment you wi ...

  10. 用CUDA写出比Numpy更快的规约求和函数

    技术背景 在前面的几篇博客中我们介绍了在Python中使用Numba来写CUDA程序的一些基本操作和方法,并且展示了GPU加速的实际效果.在可并行化的算法中,比如计算两个矢量的加和,或者是在分子动力学 ...