2009-08-04 107 views
11

我爲我的文件使用了一個簡單的解壓縮函數(如下所示),因此我不必在進一步處理它們之前手動解壓縮文件。在PHP中使用gzip解壓縮大文件

function uncompress($srcName, $dstName) { 
    $string = implode("", gzfile($srcName)); 
    $fp = fopen($dstName, "w"); 
    fwrite($fp, $string, strlen($string)); 
    fclose($fp); 
} 

問題是,如果gzip文件很大(例如50mb),解壓縮需要大量內存來處理。

問題:我可以解析一個gzip文件,並且仍然可以得到正確的結果嗎?或者還有更好的方法來處理提取大型gzip文件的問題(即使它需要幾秒鐘)?

回答

41

gzfile()是一種方便的方法,它調用gzopen,gzread和gzclose。

所以,是的,你可以手動執行gzopen和gzread文件塊。

這將解壓縮文件以4KB塊:

function uncompress($srcName, $dstName) { 
    $sfp = gzopen($srcName, "rb"); 
    $fp = fopen($dstName, "w"); 

    while (!gzeof($sfp)) { 
     $string = gzread($sfp, 4096); 
     fwrite($fp, $string, strlen($string)); 
    } 
    gzclose($sfp); 
    fclose($fp); 
} 
1

嘗試

function uncompress($srcName, $dstName) { 
    $fp = fopen($dstName, "w"); 
    fwrite($fp, implode("", gzfile($srcName))); 
    fclose($fp); 
} 

$長度參數是可選。

+0

看起來好像這種方法與使用大量內存的原始方法相同。整個文件正在讀取並保存在內存中。 – Lukas 2009-08-21 17:37:35

+0

未加載到可變數據文件中(與流式傳輸類似)。不是加載對象字符串的對象模型。這個例子不影響「php_value memory_limit」。你的例子在「php.ini」文件中影響這個變量。 – 2009-08-21 18:01:49

1

如果你是一個Linux主機上,有需要的privilegies運行命令,並安裝gzip命令,你可以嘗試用類似shell_exec

東西有點像這樣調用它,我想,會請執行以下操作:

shell_exec('gzip -d your_file.gz'); 

這樣,該文件就不會被PHP解壓縮。


一點題外話:

  • 在指令從(OT使用開關等來告訴「解壓到目錄」)
  • 你可能想看一看運行保重在escapeshellarg太;-)
+0

謝謝,我有shell訪問權限,但尚未學習如何使用它。 – Lukas 2009-08-21 17:32:01

0

正如maliayas提到的,它可能會導致的錯誤。我經歷了一個意外的while循環,但gz文件已經成功解壓。整個代碼看起來像這樣,對我來說效果更好:

function gzDecompressFile($srcName, $dstName) { 
    $error = false; 

    if($file = gzopen($srcName, 'rb')) { // open gz file 

     $out_file = fopen($dstName, 'wb'); // open destination file 

     while (($string = gzread($file, 4096)) != '') { // read 4kb at a time 
      if(!fwrite($out_file, $string)) { // check if writing was successful 
       $error = true; 
      } 
     } 

     // close files 
     fclose($out_file); 
     gzclose($file);  

    } else { 
     $error = true; 
    } 

    if ($error) 
     return false; 
    else 
     return true; 
}