在 PHP 中处理压缩文件时,zip_read() 和 zip_entry_read() 是两个非常有用的函数,能够帮助我们读取 Zip 文件中的内容。本文将详细介绍如何结合使用这两个函数,逐条读取并输出 Zip 压缩包中每个条目的内容。
zip_read(resource $zip)
该函数接受一个打开的 Zip 资源,返回一个指向 Zip 条目的资源,代表 Zip 中的当前条目。如果读取完所有条目,返回 false。
zip_entry_read(resource $zip_entry, int $len = 1024)
该函数读取指定长度的当前 Zip 条目的内容。需要传入当前 Zip 条目的资源和读取的字节数。
以下示例代码展示了如何打开一个 Zip 文件,遍历其中所有条目,并输出每个条目的内容:
<?php
// 打开一个 Zip 文件,路径示例:http://m66.net/example.zip
$zip = zip_open('http://m66.net/example.zip');
if (!$zip) {
echo "无法打开 Zip 文件。";
exit;
}
// 遍历 Zip 中的所有条目
while ($zip_entry = zip_read($zip)) {
// 获取条目名称
$entry_name = zip_entry_name($zip_entry);
echo "读取条目: $entry_name\n";
// 打开当前条目以便读取内容
if (zip_entry_open($zip, $zip_entry)) {
$content = '';
// 循环读取条目内容,避免内容过大一次读取不完
while ($data = zip_entry_read($zip_entry, 1024)) {
$content .= $data;
}
// 输出条目内容
echo "内容如下:\n";
echo $content . "\n";
// 关闭当前条目
zip_entry_close($zip_entry);
} else {
echo "无法打开条目 $entry_name 进行读取。\n";
}
echo "------------------------\n";
}
// 关闭 Zip 资源
zip_close($zip);
?>
zip_open() 函数用于打开 Zip 文件,支持本地路径,也可以是远程 URL(如示例中的 http://m66.net/example.zip)。
通过 zip_read() 循环读取每个条目。
对每个条目调用 zip_entry_open() 打开,然后用 zip_entry_read() 读取内容。这里设置一次读取 1024 字节,循环读取直到内容读完。
读取完毕后关闭条目,最后关闭整个 Zip 文件资源。
PHP 的 zip_read 函数依赖于 zip 扩展,确保你的环境已经开启了该扩展。
远程 URL 访问需要服务器支持 allow_url_fopen。
对于大型文件,建议合理控制读取块大小,避免内存溢出。
该方式适合读取文本文件或较小的二进制文件,对于复杂 Zip 操作,可以考虑使用 ZipArchive 类。