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代码优化及php相关问题总结
Oct 09 PHP
关于JSON以及JSON在PHP中的应用技巧
Nov 27 PHP
php实现水仙花数示例分享
Apr 03 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
php简单实现无限分类树形列表的方法
Mar 27 PHP
PHP中preg_match函数正则匹配的字符串长度问题
May 27 PHP
PHP代码实现爬虫记录――超管用
Jul 31 PHP
php+html5+ajax实现上传图片的方法
May 14 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
May 30 PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 PHP
PHP使用ActiveMQ实现消息队列的方法详解
May 31 PHP
is_file和file_exists效率比较
Mar 14 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中的登陆login
2007/01/18 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
js实现仿网易点击弹出提示同时背景变暗效果
2015/08/13 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
基于JavaScript实现div层跟随滚动条滑动
2016/01/12 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
详解JavaScript中的Object.is()与"==="运算符总结
2020/06/17 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
Python插件机制实现详解
2020/05/04 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
会计毕业生求职简历的自我评价
2013/10/20 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
机关副主任个人四风问题整改措施
2014/09/26 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
办公室主任个人总结
2015/02/28 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书