2012-05-20 521 views
3

我試圖解壓縮一個巨大的文件(400 + M壓縮以及4G解壓縮)使用php zip壓縮文件。我只解壓縮壓縮文件中的一個csv文件..我感興趣的文件解壓縮超過4G ..我從文件末尾獲得3條​​記錄,並且該過程進入lala land。 。我指的是過程只是那張..沒有輸出..沒有錯誤,沒有循環它只是...我還沒有線索,以什麼做了..我的代碼很簡單:PHP解壓縮大文件

$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個記錄中缺少整個文件)......但這個過程似乎在某個地方發生......它發生在fread上,我無法弄清楚發生了什麼事..它沒有達到eof ..源是完整的(使用is_source($ fp)在fread之前進行檢查..它不會拋出錯誤..關閉瀏覽器並不能阻止它..甚至不能停止阿帕奇..不得不關閉,結束它...

任何想法?

感謝

回答

1

聽起來像一個錯誤是誠實的(在PHP)。

你可能想嘗試輸出呼叫到memory_get_usage()幫助您調試。但是,也請參閱stream_copy_to_stream(),因爲您可以擺脫所有循環中的垃圾。它也可能是intresteting來保持寫入的字節總數,以查看事情出錯的數字是否可疑。

+0

據有人在文檔頁面中的功能似乎使用相當多的內存自身。所以如果這是真的,記憶是問題在這裏,這可能不是解決方案。 – Blizz

+0

嗨克里斯,試着用有趣的結果,它沒有複製整個文件,但它並沒有進入拉拉陸地,這種導致我相信第一個問題可能是最初的zip流..它可能沒有得到一切......但這是一個不同的問題,我需要在發佈之前進行一些研究。再次感謝。 – Bridget

1

這是在黑暗中刺,但嘗試增加腳本可以分配的內存量。使用gzip函數時我遇到了類似的問題,我必須做出這樣的改變。

ini_set('memory_limit', '512M'); 
+0

嗨,尼克,感謝您的建議,嘗試了它,但它沒有任何不同..但無論如何感謝 – Bridget

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;