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 相关文章推荐
改进的IP计数器
Oct 09 PHP
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
php实现统计邮件大小的方法
Aug 06 PHP
Nginx下配置codeigniter框架方法
Apr 07 PHP
PHP数组操作――获取数组最后一个值的方法
Apr 14 PHP
WordPress中使主题支持小工具以及添加插件启用函数
Dec 22 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
Yii配置与使用memcached缓存的方法
Jul 13 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
PHP实现动态创建XML文档的方法
Mar 30 PHP
PHP XML Expat解析器知识点总结
Feb 15 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
中国的第一台收音机
2021/03/01 无线电
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
php之可变函数的实例详解
2017/09/13 PHP
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
2012/01/10 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
2016/04/26 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
Angular2 组件交互实例详解
2017/08/24 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
Vue学习之组件用法实例详解
2020/01/06 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
python文件操作整理汇总
2014/10/21 Python
在MAC上搭建python数据分析开发环境
2016/01/26 Python
Python selenium如何设置等待时间
2016/09/15 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
纬创Java面试题笔试题
2014/10/02 面试题
化学实验员岗位职责
2013/12/28 职场文书
单位提档介绍信
2014/01/17 职场文书
安全检查与奖惩制度
2014/01/23 职场文书
大学生活动策划方案
2014/02/10 职场文书
教师现实表现材料
2014/02/14 职场文书
个人借款担保书
2014/04/02 职场文书
综合实践活动总结
2014/05/05 职场文书
婚礼必备主持词范本!
2019/07/23 职场文书
Golang中异常处理机制详解
2021/06/08 Golang