0

我正在使用 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 左右,因此无论如何我都不会认为这是内存问题。

4

1 回答 1

0

可能是您的最大执行时间...通过将其设置为 0 或设置一个好的值来完全禁用限制。

ini_set('max_execution_time', 10000);

...不要在生产使用中将其设置为 0 ...

如果您因为 disable_function 指令而无法访问 ini_set(),则可能必须直接在 php.ini 中编辑其值。

于 2013-05-22T18:55:20.717 回答