Skip to content

php_ref_zip

PHP 的 Zip 扩展允许你在脚本中直接创建、读取和修改 ZIP 压缩包。与 ZIP 文件交互的主要方式是通过面向对象的 ZipArchive 类。

Zip 扩展通常包含在 PHP 中,但可能并非在所有 PHP 安装中默认启用。

  • Linux 系统(使用包管理器): 通常通过 php-zip(Debian/Ubuntu)或 php-pecl-zip(CentOS/RHEL)等包安装。示例:sudo apt-get install php-zip 或 sudo yum install php-pecl-zip。之后可能需要重启你的 Web 服务器(Apache/Nginx)和 PHP-FPM。
  • Windows 系统: php_zip.dll 文件应已包含在你的 PHP 发布版本中。你需要编辑 php.ini 文件,通过取消注释或添加以下行来启用它:extension=zip。确保 php.ini 中的 extension_dir 指令指向包含 DLL 文件的目录。重启你的 Web 服务器。
  • Docker: 官方 PHP Docker 镜像通常需要在 Dockerfile 中安装扩展。示例说明通常可以在 PHP 镜像的 Docker Hub 页面上找到。
  • 检查: 你可以在终端中运行 php -m 或查看 phpinfo(); 的输出来验证扩展是否已启用(查找 ‘zip’ 部分)。

请查阅你特定操作系统或托管环境的文档以获取精确步骤。

ZipArchive 类提供了处理 ZIP 文件的方法。

通用工作流程:

  1. 创建一个 ZipArchive 对象:$zip = new ZipArchive();
  2. 打开一个现有 ZIP 文件或创建一个新文件:$zip->open('myarchive.zip', ZipArchive::CREATE);
  3. 执行操作:添加文件 (addFile())、添加目录 (addEmptyDir())、解压文件 (extractTo())、获取信息 (numFiles、statIndex()) 等。
  4. 关闭压缩包以保存更改:$zip->close();
<?php
$zip = new ZipArchive();
$filename = "./my_new_archive.zip";
// 以创建或覆盖模式打开压缩包
if ($zip->open($filename, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
// 使用文件路径添加文件
// 第二个参数是文件在压缩包内的名称
if (file_exists('file1.txt')) {
$zip->addFile('file1.txt', 'document.txt');
}
// 从字符串添加文件
$zip->addFromString('generated.txt', 'This content was generated on the fly.');
// 添加一个空目录
$zip->addEmptyDir('new_folder');
// 添加目录中的所有文件(递归示例)
$sourceDir = './files_to_zip'; // 包含文件的目录
if (is_dir($sourceDir)) {
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($sourceDir, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
// 跳过目录(它们会自动添加)
if (!$file->isDir()) {
$filePath = $file->getRealPath();
// 获取相对路径,以便正确存储在 zip 中
$relativePath = substr($filePath, strlen($sourceDir) + 1);
$zip->addFile($filePath, $relativePath);
}
}
}
// 关闭并保存压缩包
$zip->close();
echo 'Archive created successfully.';
} else {
echo 'Failed to create the archive.';
}
?>
<?php
$zip = new ZipArchive();
$filename = "./my_new_archive.zip";
$extractToPath = "./extracted_files";
// 以读取模式打开压缩包
if ($zip->open($filename) === TRUE) {
// 如果解压目录不存在则创建
if (!is_dir($extractToPath)) {
mkdir($extractToPath, 0755, true);
}
// 将所有内容解压到指定路径
if ($zip->extractTo($extractToPath)) {
echo 'Archive extracted successfully.';
} else {
echo 'Failed to extract archive.';
}
// 关闭压缩包
$zip->close();
} else {
echo 'Failed to open the archive.';
}
?>

示例:读取压缩包中的文件列表

Section titled “示例:读取压缩包中的文件列表”
<?php
$zip = new ZipArchive();
$filename = "./my_new_archive.zip";
if ($zip->open($filename) === TRUE) {
echo "Archive '{$filename}' contains: " . $zip->numFiles . " files/directories.\n";
echo "-------------------------------------\n";
for ($i = 0; $i < $zip->numFiles; $i++) {
$stats = $zip->statIndex($i);
if (!$stats) continue;
echo "Name: " . $stats['name'] . "\n";
echo "Size (uncompressed): " . $stats['size'] . " bytes\n"; // 大小 (未压缩)
echo "Size (compressed): " . $stats['comp_size'] . " bytes\n"; // 大小 (已压缩)
echo "-------------------------------------\n";
}
$zip->close();
} else {
echo 'Failed to open the archive.';
}
?>

以下是一些常用的方法:

请查阅PHP 官方 ZipArchive 文档以获取完整列表和详细说明。