php распаковывает огромные файлы

Я пытаюсь разархивировать огромный файл (400+M сжато более чем 4G в разархивированном виде), используя php zip-архив. Я распаковываю только один 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.. источник не поврежден (проверено с помощью is_source($fp) непосредственно перед fread.. он не выдает ошибок.. закрытие браузера не останавливает его.. даже не может остановить apache.. нужно закрыть, чтобы закончить его...

есть идеи??

Спасибо


person Bridget    schedule 20.05.2012    source источник


Ответы (2)


звучит как ошибка, если честно (в php).

вы можете попробовать вывести вызовы memory_get_usage(), чтобы облегчить отладку. Но также см. stream_copy_to_stream(), потому что вы можете избавиться от всего этого циклического мусора. Также может быть интересно вести подсчет записанных байтов, чтобы увидеть, не выглядит ли подозрительным число, в котором что-то идет не так.

person goat    schedule 20.05.2012
comment
По словам кого-то на странице документации, функция сама по себе использует довольно много памяти. Так что, если это правда и здесь проблема с памятью, это может быть не решение. - person Blizz; 20.05.2012
comment
Привет, Крис, попробовал с интересными результатами, он не скопировал весь файл, но и не ушел в лала-ленд, что наводит меня на мысль, что первая проблема может быть начальным zip-потоком. может быть, не все получается... но это другой вопрос, и мне нужно провести некоторое исследование, прежде чем публиковать... еще раз спасибо. - person Bridget; 20.05.2012

Это удар в темноте, но попробуйте увеличить объем памяти, который может выделить сценарий. У меня были похожие проблемы при использовании функций gzip, и мне пришлось внести это изменение.

ini_set('memory_limit', '512M');
person Nick Clark    schedule 20.05.2012
comment
Привет, Ник, спасибо за предложение, попробовал, но разницы нет. но все равно спасибо - person Bridget; 20.05.2012