0

PHPでzipアーカイブを抽出する作業を行っています。アーカイブの構造は 7 つのフォルダーで、各フォルダーには約 1 kB のファイルが約 10,000 個含まれています。

私のコードは非常にシンプルで、ZipArchive クラスを使用しています。

$zip = new ZipArchive();
$result = $zip->open($filename);
if ($result === true) {
    $zip->extractTo($tmpdir);
    $zip->close();
}

ただし、私が抱えている問題は、抽出が停止しているように見えることです。最初のフォルダーは完全に抽出されていますが、2 番目のフォルダーは約半分しか抽出されていません。他の 5 つはまったく抽出されません。

また、一度に 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 に答える