為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); ?>
最佳化提示:
不幸的是,在這種情況下設定標頭來指示串流或未知內容長度並不簡單。
關於flush()的注意事項:需要注意的是,在內部調用flush()由於Apache 的內部輸出緩衝區溢出,讀取/回顯循環可能會導致大檔案和慢速網路問題。因此,最好在程式碼中省略flush()呼叫。以上是如何在 LAMP 堆疊上串流大型 Zip 檔案以加快下載速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!