php调用nginx的mod_zip模块打包ZIP文件


Posted in PHP onJune 11, 2014

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 );

逐条输出要打包的文件。

$crc32 是 16 进制的文件 crc32 值。也可以不提供,用 “-” 代替。不过这样就没法用 Range 分块下载,断点续传了。
$size 是文件大小的十进制整数。
$url 是要打包的源地址。如果要打包一个本地文件,可以先在 nginx 中做一个 internal path。
$path 是 zip 包中的路径。

不过这样没法创建空目录。一方面,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 大小文件。所以,这点还需要自己斟酌处理。
PHP 相关文章推荐
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
Oct 20 PHP
PHP Yii框架之表单验证规则大全
Nov 16 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
WordPress过滤垃圾评论的几种主要方法小结
Jul 11 PHP
PHP中文字符串截断无乱码解决方法
Oct 10 PHP
Yii1.1中通过Sql查询进行的分页操作方法
Mar 16 PHP
yii2 上传图片的示例代码
Nov 02 PHP
PHP一个简单的无需刷新爬虫
Jan 05 PHP
PHP getDocNamespaces()函数讲解
Feb 03 PHP
浅析PHP7 的垃圾回收机制
Sep 06 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Jan 22 PHP
php+ajax导入大数据时产生的问题处理
Jun 11 #PHP
CI框架中libraries,helpers,hooks文件夹详细说明
Jun 10 #PHP
PHP图片等比例缩放生成缩略图函数分享
Jun 10 #PHP
CI(CodeIgniter)框架中的增删改查操作
Jun 10 #PHP
PHP定时更新程序设计思路分享
Jun 10 #PHP
CI(CodeIgniter)框架配置
Jun 10 #PHP
教你如何用php实现LOL数据远程获取
Jun 10 #PHP
You might like
php 读取shell管道传输过来的内容
2010/03/01 PHP
Smarty3配置及入门语法
2017/02/22 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
function foo的原型与prototype属性解惑
2010/11/19 Javascript
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
jQuery插件MixItUp实现动画过滤和排序
2015/04/12 Javascript
jQuery实现checkbox全选的方法
2015/06/10 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
浅谈webpack-dev-server的配置和使用
2018/05/17 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
Vue 项目分环境打包的方法示例
2018/08/03 Javascript
详解Vue底部导航栏组件
2019/05/02 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
windows系统中python使用rar命令压缩多个文件夹示例
2014/05/06 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
马来西亚太阳镜、眼镜和隐形眼镜网上商店:Focus Point
2018/12/13 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
偷看我的初中毕业鉴定
2014/01/29 职场文书
电脑销售顾问自荐信
2014/01/29 职场文书
小学语文复习计划
2015/01/19 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技
一条 SQL 语句执行过程
2022/03/17 MySQL
pycharm无法安装cv2模块问题
2022/05/20 Python