PHP 內建的 Zip 模組雖然方便,但僅支援本地檔案打包。當需要打包來自網路的遠端檔案時,往往必須先下載儲存為臨時檔案,這在檔案數量大或體積龐大時極其低效,且會佔用 PHP 進程大量時間,嚴重影響並發能力。
Nginx 的第三方模組 mod_zip 提供了更優雅的解決方案。其原理類似 X-Accel-Redirect:PHP 只需輸出檔案的元資訊(CRC32、大小、來源 URL、壓縮包內路徑),並發送特定回應標頭 X-Archive-Files: zip,Nginx 即會接管回應主體,完成串流式打包並輸出給用戶端,完全繞過 PHP 進程。
PHP 需逐行輸出每個檔案的資訊,格式如下:
printf("%s %d %s %s\n", $crc32, $size, $url, $path);
- 代替,但將失去 Range 分塊下載與斷點續傳能力。internal 路徑映射。ZIP 格式本身不定義空目錄,慣例是建立一個以 / 結尾、大小為 0 的項目。需在 Nginx 側建立一個 internal 的 0 位元組檔案(如 /_0),輸出時指定路徑結尾加斜線:
printf("%s %d %s %s\n", '00000000', 0, '/_0', $path . '/');
可透過回應標頭 X-Archive-Charset: utf8 指定輸出編碼,模組會依標準轉為 UTF-8。但各解壓軟體支援度不一:WinRAR 表現最佳,7-Zip 可能將中文空目錄誤判為 0 位元組檔案,Windows 原生解壓則僅支援 GBK。實際部署時需根據用戶端環境權衡編碼策略。
透過 mod_zip 將打包邏輯下沉到 Nginx 層,PHP 僅負責業務邏輯與元資料組裝,極大降低記憶體佔用與阻塞風險,是大規模檔案打包下載的理想架構選擇。