讓 php 用 nginx 打包 zip

2022-02-11 18:35:32 字數 881 閱讀 7025

php 本身有 zip 模組,可以生產 zip 檔案。但是這個 zip 模組只能使用本地檔案來打包。如果需要打包輸出的檔案來自網路,就得先儲存臨時檔案。在檔案數量多或者檔案大的時候就很杯具。另外,由 php 來輸出大的打包檔案會占用 php 程序大量時間,影響併發能力。

nginx 有乙個第三方模組,mod_zip 。同樣可以輸出 zip 包。和 x-accel-redirect 有點類似,只需要 php 輸出相應檔案的路徑等資訊,然後給乙個特殊的響應頭即可。

nginx zip 模組使用的響應頭是 x-archive-files: zip 。加上這個響應頭,nginx zip 模組就會處理響應正文,完成打包輸出。

比如:

printf("%s %d %s %s\n", $crc32, $size, $url, $path );
逐條輸出要打包的檔案。

不過這樣沒法建立空目錄。一方面,zip 格式開始就沒有定義空目錄,後來的標準和軟體都是通過加乙個 / 結尾的 0 大小檔案來實現的。這時,就需要先在 nginx 中做乙個 internal 的 0 大小檔案,比如位於 /_0 。然後輸出

printf("%s %d %s %s\n", '00000000', 0, '/_0', $path.'/');
如果要支援中文路徑,可以使用 x-archive-charset: utf8 這樣的響應頭,內容為你輸出的編碼。nginx zip 模組會按標準轉換成 utf8 的標準格式。不過各個軟體對這個 zip 的標準支援不一,比如 windows 的 zip 目錄就不支援,只能以 gbk 編碼直接輸出。其他軟體對編碼支援效果也各不相同。測試過的 winrar,7zip,windows zip 目錄中,winrar 倒是都可以很好支援。7zip 可能會把部分中文空目錄變成 0 大小檔案。所以,這點還需要自己斟酌處理。

Linux下用zip打包部分檔案

linux下用zip命令打包乙個資料夾並且排除資料夾中的某些子資料夾 使用 x後面接需要排除的資料夾 檔名。若是資料夾注意需要後面的 例如備份ghost專案的shell指令碼 bin bash 定義全域性變數 project name ghost backup name ghost backup p...

在nginx上用FastCGI解析PHP

nginx配置檔案 nginx 預設使用 include enable php.conf 通過enable php.conf 來解析php,該檔案內容如下 location php 而我們使用nginx自然要使用fastcgi來跑php,nginx之所以併發高跟fastcgi脫不開關係,有自動管理p...

nginx用php上傳大檔案的配置

通過設定nginx的client max body size解決nginx php上傳大檔案的問題 用nginx來做webserver的時,上傳大檔案時需要特別注意client max body size這個引數,否則會中斷在nginx的請求中,在php中是無法記錄到訪問的.一般上傳大檔案流程 首先...