首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 結合 Nginx mod_zip 模組高效打包 ZIP 文件

     編輯:PHP 綜合知識

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);
  • $crc32:文件 CRC32 值(十六進制),不可用時用 - 代替;缺失將導致無法支援 Range 分塊下載與斷點續傳。
  • $size:文件大小(十進制整數)。
  • $url:源文件地址。本地文件需在 Nginx 配置 internal 路徑映射。
  • $path:ZIP 內部存放路徑。

創建空目錄技巧

ZIP 標準通過「以 / 結尾且大小為 0 的文件」表示空目錄。需在 Nginx 建立一個 internal 的 0 字節文件(如 /_0),輸出:

printf("%s %d %s %s\n", '00000000', 0, '/_0', $path . '/');

中文路徑編碼處理

可添加響應頭 X-Archive-Charset: utf8,模組會按標準轉為 UTF-8 格式。但各解壓軟體支援度不一:

  • WinRAR 完美支援 UTF-8 路徑。
  • 7-Zip 可能將部分中文空目錄誤判為 0 字節文件。
  • Windows 原生「壓縮資料夾」僅支援 GBK 編碼。

建議根據用戶群體選擇編碼策略,或提供多版本下載。

優勢總結

  • 零拷貝傳輸,PHP 進程瞬間釋放。
  • 支援超大文件、遠程資源直打包。
  • 原生支援斷點續傳(需提供 CRC32)。

此方案極適合高併發、大數據量的打包下載場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved