PHP ZipArchive类的用法(附带实例)
本节介绍 PHP 程序中如何使用 ZipArchive 类处理 zip 压缩文件,下面先了解一些常用的方法。
如果 open() 方法返回 true,表示成功打开压缩文件,否则会返回相应的错误代码,包括:
zip 文件操作完成后,可以使用 close() 方法关闭。
向 zip 文档添加内容时,可以使用如下函数。
1) addEmptyDir() 方法的功能是向压缩文件添加空目录,定义如下:
2) addFile() 方法的功能是向压缩文件添加文件,定义如下:
3) addFromString() 方法用于添加指定的文件名和内容,定义如下:
4) addGlob() 方法用于从指定目录中按 glob 模式添加文件,定义如下:
5) addPattern() 方法用于从指定目录中按 PCRE 模式(正则表达式)添加文件,定义如下:
6) 解压文件时可以使用 extractTo() 方法,其定义如下:
下面将综合演示压缩与解压缩操作。
下面的代码打开(或创建)d:\test.zip 文件,并将 a1.txt 和 a2.txt 文件添加到压缩文件中:
下面的代码使用 addFromString() 方法向 d:\test.zip 压缩文件中添加 a3.txt 文件:
在下面的代码中,通过 addGlob() 文件将 d:\testdir 目录中的 b1.txt 和 b2.txt 文件添加到 d:\test.zip 压缩文件中的 b 目录下。
下面的代码将 d:\test.zip 压缩文件解压到 d:\testdir1 目录中:
使用 phpinfo() 函数查询模块信息时,也可以看到所支持的压缩和加密方法。此外,PHP 8 中还可以在文档关闭后检查错误状态,包括 status 和 statusSys 属性,以及 getStatusString() 方法。
addGlob() 和 addPattern() 方法中的 remove_path 参数指定的内容以前作为一个目录名,而现在会匹配任何内容,匹配的内容可以使用 add_path 参数指定的内容替换。
ZipArchive类常用方法
首先是 open() 方法,用于打开zip文件,方法定义如下:ZipArchive::open(string $filename[, int $flags]) : mixed其中,参数 $filename 指定 zip 文件路径;参数 $flags 指定打开模式,可用的值包括:
- ZipArchive::OVERWRITE;
- ZipArchive::CREATE;
- ZipArchive::EXCL;
- ZipArchive::CHECKCONS。
如果 open() 方法返回 true,表示成功打开压缩文件,否则会返回相应的错误代码,包括:
- ZipArchive::ER_EXISTS,文件已存在;
- ZipArchive::ER_INCONS,文件不标准;
- ZipArchive::ER_INVAL,无效的参数;
- ZipArchive::ER_MEMORY,分配内存失败;
- ZipArchive::ER_NOENT,找不到文件;
- ZipArchive::ER_NOZIP,不是 zip 文件;
- ZipArchive::ER_OPEN,不能打开文件;
- ZipArchive::ER_READ,读取文件错误;
- ZipArchive::ER_SEEK,搜索错误。
zip 文件操作完成后,可以使用 close() 方法关闭。
向 zip 文档添加内容时,可以使用如下函数。
1) addEmptyDir() 方法的功能是向压缩文件添加空目录,定义如下:
ZipArchive::addEmptyDir(string $dirname) : bool其中,参数 $dirname 指定新的目录名称,添加成功时返回 true,否则返回 false。
2) addFile() 方法的功能是向压缩文件添加文件,定义如下:
ZipArchive::addFile(string $filename[, string $localname = NULL[, int $start = 0[, int $length = 0]]]) : booladdFile() 方法的功能是将 $filename 指定的文件添加到 zip 文件,并可通过 $localname 参数指定文件在 zip 文件中的名称,$start 和 $length 参数暂不使用。添加成功时返回 true,否则返回 false。
请注意,如果不指定 $localname 参数,添加到 zip 文件的文件会保持原目录结构。
3) addFromString() 方法用于添加指定的文件名和内容,定义如下:
ZipArchive::addFromString(string $localname, string $contents) : bool其中,$localname 指定在 zip 文件中显示的文件名;$contents 指定文件添加的内容。操作成功时返回 true,否则返回 false。
4) addGlob() 方法用于从指定目录中按 glob 模式添加文件,定义如下:
ZipArchive::addGlob(string $pattern[, int $flags = 0[, array $options = array()]]) : bool其中,$pattern 设置目录中文件的过滤模式;参数 $flags 指定一个 glob 标识;参数 $options 使用一个数组指定参数,包括:
- add_path键,指定 remove_all_path 参数为 true,可以使用此参数指定添加的文件在zip文件中的路径;
- remove_path 键,设置为 true,删除匹配的路径后添加到 zip 文件;
- remove_all_path 键,设置为 true,添加的文件不包含原始路径,并添加到 zip 文件的根路径下。
5) addPattern() 方法用于从指定目录中按 PCRE 模式(正则表达式)添加文件,定义如下:
ZipArchive::addPattern(string $pattern[, string $path = "."[, array $options = array()]]) : bool其中,参数 $pattern 设置为一个 PCRE(Perl-compatible Regular Expression) 模式;参数 $path 指定搜索文件的路径;$options 通过数组设置操作参数,设置方法和 addGlob() 方法相同。
6) 解压文件时可以使用 extractTo() 方法,其定义如下:
ZipArchive::extractTo(string $destination[, mixed $entries]) : bool函数会将 zip 文件中的内容解压到 $destination 参数指定的路径。
下面将综合演示压缩与解压缩操作。
ZipArchive类应用实例
首先,在 d: 盘根目录下创建 testdir 目录,其中创建 a1.txt、a2.txt、b1.txt和b2.txt 文件,并可以在文件中添加一些内容。下面的测试将基于这些文件进行。下面的代码打开(或创建)d:\test.zip 文件,并将 a1.txt 和 a2.txt 文件添加到压缩文件中:
<?php $zipfile = "d:\\test.zip"; $za = new ZipArchive(); if($za->open($zipfile,ZipArchive::CREATE)===true) { var_dump($za->addFile("d:/testdir/a1.txt","a1.txt")); var_dump($za->addFile("d:/testdir/a2.txt","a2.txt")); $za->close(); }else{ echo " 打开 zip 文件失败 "; } ?>如果页面显示两个 bool(true),则表示两个文件已成功添加到 d:\test.zip 压缩文件中,并保存到压缩文件中的根(/)路径下。
下面的代码使用 addFromString() 方法向 d:\test.zip 压缩文件中添加 a3.txt 文件:
<?php $zipfile = "d:\\test.zip"; $za = new ZipArchive(); if($za->open($zipfile,ZipArchive::CREATE)===true) { var_dump($za->addFromString("a3.txt","aaa")); $za->close(); }else{ echo " 打开 zip 文件失败 "; } ?>执行代码会在 d:\test.zip 压缩文件的根路径下创建 a3.txt,并指定文件内容为
aaa
。在下面的代码中,通过 addGlob() 文件将 d:\testdir 目录中的 b1.txt 和 b2.txt 文件添加到 d:\test.zip 压缩文件中的 b 目录下。
<?php $zipfile = "d:\\test.zip"; $za = new ZipArchive(); if($za->open($zipfile,ZipArchive::CREATE)===true) { $opt = array("add_path"=>"b/","remove_path"=>"d:/testdir"); var_dump($za->addGlob("d:/testdir/b*.txt",0,$opt)); $za->close(); }else{ echo " 打开 zip 文件失败 "; } ?>
下面的代码将 d:\test.zip 压缩文件解压到 d:\testdir1 目录中:
<?php $zipfile = "d:\\test.zip"; $za = new ZipArchive(); if($za->open($zipfile,ZipArchive::CREATE)===true) { var_dump($za->extractTo("d:/testdir1")); $za->close(); }else{ echo " 打开 zip 文件失败 "; } ?>解压后的 d:\testdir1 目录的结构见下图:

PHP 8中的新版本
在 PHP 8 中,默认的 ZipArchive 版本升级为 1.19.1,并在 ZipArchive 类中增加了一些成员,如:- lastId 属性,返回最后一次添加内容的索引值。
- setMtimeName() 和 setMtimeIndex() 方法,设置修改时间。
- registerProgressCallback() 方法,注册文件关闭时的更新操作。
- registerCancelCallback() 方法,注册文件关闭时的取消操作。
- replaceFile() 方法,替换压缩文件中的文件。
- isCompressionMethodSupported() 方法,检查是否支持指定的压缩方法。
- isEncryptionMethodSupported() 方法,检查是否支持指定的加密方法。
使用 phpinfo() 函数查询模块信息时,也可以看到所支持的压缩和加密方法。此外,PHP 8 中还可以在文档关闭后检查错误状态,包括 status 和 statusSys 属性,以及 getStatusString() 方法。
addGlob() 和 addPattern() 方法中的 remove_path 参数指定的内容以前作为一个目录名,而现在会匹配任何内容,匹配的内容可以使用 add_path 参数指定的内容替换。