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出错界面
Oct 09 PHP
PHP教程 基本语法
Oct 23 PHP
PHP IF ELSE简化/三元一次式的使用
Aug 22 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
Jun 12 PHP
php使用GeoIP库实例
Jun 27 PHP
php实现文件下载代码分享
Aug 19 PHP
PHP实现采集中国天气网未来7天天气
Oct 15 PHP
Yii框架上传图片用法总结
Mar 28 PHP
PHP 绘制网站登录首页图片验证码
Apr 12 PHP
php使用crypt()函数进行加密
Jun 08 PHP
thinkphp5使用无限极分类
Feb 18 PHP
不常用但很实用的PHP预定义变量分析
Jun 25 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获取当月最后一天函数分享
2015/02/02 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
jQuery常用且重要方法汇总
2015/07/13 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
曼城官方网上商店:Manchester City
2019/09/10 全球购物
英语专业毕业个人求职自荐信
2013/09/21 职场文书
大专生工程监理求职信
2013/10/04 职场文书
毕业学生推荐信
2013/12/01 职场文书
英语老师推荐信
2014/02/26 职场文书
校长创先争优承诺书
2014/08/30 职场文书
2014年国庆节寄语
2014/09/19 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技