我正在使用 PHP 提取 zip 存档。档案的结构是七个文件夹,每个文件夹包含大约 10,000 个文件,每个文件大约 1 kB。
我的代码非常简单,并且使用了 ZipArchive 类:
$zip = new ZipArchive();
$result = $zip->open($filename);
if ($result === true) {
$zip->extractTo($tmpdir);
$zip->close();
}
不过,我遇到的问题是提取似乎停止了。第一个文件夹已完全提取,但只有第二个文件夹的一半。其他五个都没有被提取出来。
我也尝试使用这段代码,它一次将其分成 10 kB 的块,但得到了完全相同的结果:
$archive = zip_open($filename);
while ($entry = zip_read($archive)) {
$size = zip_entry_filesize($entry);
$name = zip_entry_name($entry);
if (substr($name, -1) == '/') {
if (!file_exists($tmpdir . $name)) mkdir($tmpdir . $name);
} else {
$unzipped = fopen($tmpdir . $name, 'wb');
while ($size > 0) {
$chunkSize = ($size > 10240) ? 10240 : $size;
$size -= $chunkSize;
$chunk = zip_entry_read($entry, $chunkSize);
if ($chunk !== false) fwrite($unzipped, $chunk);
}
fclose($unzipped);
}
}
我还尝试将 PHP 中的内存限制从 512 MB 增加到 1024 MB,但又得到了相同的结果。解压缩后的所有内容都在 100 MB 左右,因此无论如何我都不会认为这是内存问题。