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中是無法記錄到訪問的.一般上傳大檔案流程 首先...