PHP 內建的 Zip 擴展雖然方便,但只能打包本地文件。若需打包遠程資源,勢必先下載並存為臨時文件,文件數量大或體積大時極其低效,且會長時間佔用 PHP 進程,嚴重影響並發能力。
Nginx 的第三方模組 mod_zip 完美解決此問題。其原理類似 X-Accel-Redirect:PHP 僅需輸出文件元信息(路徑、大小、CRC32、存檔路徑)並發送特定響應頭 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 格式。但各解壓軟體支援度不一:
建議根據用戶群體選擇編碼策略,或提供多版本下載。
此方案極適合高併發、大數據量的打包下載場景。