3

php zipアーカイブを使用して巨大なファイル(400 + Mが4Gで圧縮されている)を解凍しようとしています。zipファイルで1つのcsvファイルのみを解凍しています。興味のあるファイルを解凍すると、4Gを超えます。ファイルの最後から最大3つのレコードを取得し、プロセスがララランドに移ります。 。つまり、プロセスは単純に進行します。出力はありません。エラーは発生しません。ループは発生しません。処理が何をしているのかわかりません。コードは単純です。

$zip = new ZipArchive;
$res = $zip->open($file);
if ($res === TRUE) 
{
   $num = $zip->numFiles;
   for($i = 0; $i < $zip->numFiles; $i++) 
   {
      $filename = $zip->getNameIndex($i);
  // if its the file I want then...
      $content = '';
  // my output file  .. yes I've already checked to make sure the dir exists
      $unzipped = fopen($dir ."/2" . $filename  , 'wb');         
      $fp = $zip->getStream($filename);
      if(!$fp) exit("failed\n");
      while (!feof($fp))
      {
    $chunkSize = 10240;
    $contents = fread($fp, $chunkSize);
        $fwrite = fwrite($unzipped, $contents);
      }
      fclose($fp);
      fclose($unzipped);
    }

    $zip->close();
    fclose($filename);

}  

進行状況を追跡するために別のファイルに移動する書き込みステートメントを削除しました。私はファイルの大部分を取り出します..(ファイル全体の3つのレコードが不足していると言ったように)...しかし、プロセスはどこかで起こっているようです..それは恐怖で起こります私は何が起こっているのか理解できません.. eofに到達していません..ソースはそのままです(freadの直前にis_source($ fp)でチェックされます..エラーはスローされません..ブラウザを閉じても停止しません..停止することもできませんapache..それを終了するにはシャットダウンする必要があります...

何か案は??

ありがとう

4

3 に答える 3

1

正直なところ、バグのように聞こえます(phpで)。

デバッグに役立てるために、 memory_get_usage()への呼び出しを出力してみてください。しかし、また、stream_copy_to_stream()を参照してください。これは、ループしているすべての問題を取り除くことができるためです。物事がうまくいかない数が疑わしいように見えるかどうかを確認するために、現在の合計バイト数を書き込み続けるのも興味深いかもしれません。

于 2012-05-20T03:16:30.893 に答える
1

これは暗闇の中での刺し傷ですが、スクリプトが割り当てることができるメモリの量を増やしてみてください。gzip関数を使用するときに同様の問題が発生したため、この変更を行う必要がありました。

ini_set('memory_limit', '512M');
于 2012-05-20T06:13:13.540 に答える
0
$filename = '/media/file.gz';

$unzipped_content = '';   
$zd = gzopen($filename, "r");
while ($zip_file = gzread($zd, 10000000)){
    $unzipped_content.= $zip_file;
}
gzclose($zd);

echo $unzipped_content;
于 2014-07-06T23:32:57.707 に答える