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 相关文章推荐
使用 MySQL 开始 PHP 会话
Dec 21 PHP
PHP 常用函数库和一些实用小技巧
Jan 01 PHP
九个你必须知道而且又很好用的php函数和特点
Aug 08 PHP
destoon各类调用汇总
Jun 20 PHP
PHP图像处理类库及演示分享
May 17 PHP
PHP基于yii框架实现生成ICO图标
Nov 13 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
Dec 11 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
php上传图片类及用法示例
May 11 PHP
php简单压缩css样式示例
Sep 22 PHP
laravel 中如何使用ajax和vue总结
Aug 16 PHP
PHP5.5新特性之yield理解与用法实例分析
Jan 11 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 字符转义 注意事项
2009/05/27 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
js 实现 input type="file" 文件上传示例代码
2013/08/07 Javascript
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
yarn的使用与升级Node.js的方法详解
2017/06/04 Javascript
nodejs基础之常用工具模块util用法分析
2018/12/26 NodeJs
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
vue把输入框的内容添加到页面的实例讲解
2019/11/11 Javascript
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
2018/03/23 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
Python OpenCV中的resize()函数的使用
2019/06/20 Python
python队列原理及实现方法示例
2019/11/27 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
财务管理个人自荐书范文
2013/11/24 职场文书
实习自我评价怎么写
2013/12/02 职场文书
企业员工薪酬方案
2014/06/04 职场文书
合同意向书范本
2014/07/30 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
寒山寺导游词
2015/02/03 职场文书
2015年行政工作总结范文
2015/04/09 职场文书
学生病假条怎么写
2015/08/17 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书
goland 设置project gopath的操作
2021/05/06 Golang
python全面解析接口返回数据
2022/02/12 Python