当前位置: 首页> 最新文章列表> 如何用 PHP 的 zip_read() 函数一步步读取 Zip 文件中的下一个条目?

如何用 PHP 的 zip_read() 函数一步步读取 Zip 文件中的下一个条目?

M66 2025-07-04

在 PHP 中处理压缩文件是一项常见的任务,尤其是在处理上传的打包数据或自动化部署时。其中,zip_read()ZipArchive 的一个老旧接口,用于遍历 ZIP 文件中的每一个条目。尽管这种方式已经被面向对象的 ZipArchive 类替代得越来越多,但在某些特定的项目或兼容性需求下,zip_read() 依旧具备实用价值。

本文将通过实际示例,逐步演示如何使用 zip_read() 函数读取 ZIP 文件中每一个条目的信息。

1. 准备一个 ZIP 文件

首先你需要一个 ZIP 文件,可以是任意的文件集合,例如包含几个 .txt 文件的压缩包。我们假设你已经有一个名为 example.zip 的压缩文件,并将其放置在服务器目录中,例如:

/var/www/html/files/example.zip

2. 打开 ZIP 文件

PHP 提供了 zip_open() 函数来打开 ZIP 文件,返回一个资源句柄。这个句柄将用于后续读取条目。

<?php
$zipPath = '/var/www/html/files/example.zip';
$zip = zip_open($zipPath);

if (is_resource($zip)) {
    echo "ZIP 文件打开成功。\n";
} else {
    echo "无法打开 ZIP 文件。\n";
}
?>

3. 使用 zip_read() 遍历条目

一旦打开了 ZIP 文件,我们可以使用 zip_read() 在其中迭代每一个条目。下面是完整的读取过程:

<?php
$zipPath = '/var/www/html/files/example.zip';
$zip = zip_open($zipPath);

if (is_resource($zip)) {
    while ($zipEntry = zip_read($zip)) {
        $entryName = zip_entry_name($zipEntry);
        echo "发现条目: " . $entryName . "\n";

        if (zip_entry_open($zip, $zipEntry, "r")) {
            $contents = zip_entry_read($zipEntry, zip_entry_filesize($zipEntry));
            echo "内容预览: " . substr($contents, 0, 100) . "\n\n";
            zip_entry_close($zipEntry);
        }
    }
    zip_close($zip);
} else {
    echo "打开 ZIP 文件失败。\n";
}
?>

在这段代码中,我们通过 zip_read() 获取当前条目,然后通过 zip_entry_name() 获取文件名,并使用 zip_entry_read() 读取文件内容。请注意,由于某些条目可能是二进制文件或大型文件,所以这里只预览前 100 个字符。

4. 一个实际应用场景示例

假设你提供一个上传接口,用户上传的 ZIP 文件会被服务器解压并检查内容是否合法。你可以通过 zip_read() 遍历文件,并查找是否存在特定文件名,如 config.json

<?php
$zipPath = '/var/www/html/uploads/user_upload.zip';
$zip = zip_open($zipPath);
$foundConfig = false;

if (is_resource($zip)) {
    while ($zipEntry = zip_read($zip)) {
        if (zip_entry_name($zipEntry) === 'config.json') {
            $foundConfig = true;
            break;
        }
    }
    zip_close($zip);
}

if ($foundConfig) {
    echo "上传包中包含 config.json,符合要求。\n";
} else {
    echo "缺少 config.json 文件,上传无效。\n";
}
?>

5. 注意事项

  • zip_read() 是过程式的旧接口,在新的项目中推荐使用 ZipArchive

  • 在高并发场景中,手动操作资源句柄时要特别小心文件句柄的释放问题。

  • 若使用 Web 上传文件功能,请确保 php.ini 中相关的上传大小限制配置得当,例如 upload_max_filesizepost_max_size

6. 结语

虽然 zip_read() 属于较老的 PHP ZIP 操作函数,但在某些场景下仍具有学习与使用价值。通过本文的示例,相信你已经了解了如何一步步地用 zip_read() 函数读取 ZIP 文件中的每一个条目,并应用于实际项目中,例如自动化内容校验、上传文件审查等。