首頁 >後端開發 >php教程 >如何在 LAMP 堆疊上串流大型 Zip 檔案以加快下載速度?

如何在 LAMP 堆疊上串流大型 Zip 檔案以加快下載速度?

Barbara Streisand
Barbara Streisand原創
2024-11-08 02:42:02682瀏覽

How to Stream Large Zip Files on LAMP Stack for Faster Downloads?

為LAMP 堆棧上的大文件創建動態Zip 文件

問題:

當建立多個大檔案的zip 檔案供使用者下載時,傳統方法會導致嚴重的效能問題由於CPU 和磁碟使用率過高,導致初始階段。

使用流式處理的解決方案:

為了解決這個問題,我們可以透過使用popen( ) 或proc_open() 執行zip 命令管道並以PHP 流的形式檢索標準輸出。透過將其與 Web 伺服器進程結合,我們可以在動態建立 zip 檔案時將其串流傳輸給使用者。

使用popen() 實作:

<?php
// Set necessary headers
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename="file.zip"');

// Execute zip command and retrieve stdout as a stream
$fp = popen('zip -r - file1 file2 file3', 'r');

// Read and echo data in chunks
$bufsize = 65535;
$buff = '';
while (!feof($fp)) {
    $buff = fread($fp, $bufsize);
    echo $buff;
}
pclose($fp);
?>

最佳化提示:

  • 最佳化提示:
  • 使用適當的緩衝區>使用適當的緩衝區大小(例如Benji 在評論中建議的8192)。
  • 如有必要,請關閉魔術引號。

    設定 mb_http_output('pass') 以獲得最佳效能。
    • 使用適當的內容相關標頭:
    內容類型:application/zip
內容處置:附件; filename="file.zip"

不幸的是,在這種情況下設定標頭來指示串流或未知內容長度並不簡單。

關於flush()的注意事項:需要注意的是,在內部調用flush()由於Apache 的內部輸出緩衝區溢出,讀取/回顯循環可能會導致大檔案和慢速網路問題。因此,最好在程式碼中省略flush()呼叫。

以上是如何在 LAMP 堆疊上串流大型 Zip 檔案以加快下載速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn