使用PHP解压缩文件,但不提取所有文件

时间:2013-05-22 18:51:38

标签: php zip wamp

我正在使用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左右,所以无论如何我都不会预料到它会成为内存问题。

1 个答案:

答案 0 :(得分:0)

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

ini_set('max_execution_time', 10000);

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

如果由于disable_function指令而无权访问ini_set(),则可能需要直接在php.ini中编辑其值。