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 相关文章推荐
计算2000年01月01日起到指定日的天数
Oct 09 PHP
在php MYSQL中插入当前时间
Apr 06 PHP
PHP IPV6正则表达式验证代码
Feb 16 PHP
PHP源代码数组统计count分析
Aug 02 PHP
gd库图片下载类实现下载网页所有图片的php代码
Aug 20 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
Apr 11 PHP
PHP文件操作实例总结
Sep 27 PHP
PHP正则表达式笔记与实例详解
May 09 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 PHP
php数值计算num类简单操作示例
May 15 PHP
PHP对接阿里云虚拟号的实现(号码隐私保护)
Apr 06 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+javascript模拟Matrix画面
2006/10/09 PHP
php提示undefined index的几种解决方法
2012/05/21 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
js对象的比较
2011/02/26 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
2016/09/20 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
jQuery plugin animsition使用小结
2017/09/14 jQuery
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
Vue 列表上下过渡效果的实例代码
2019/06/25 Javascript
javascript实现留言板功能
2020/02/08 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
Python内置数据类型详解
2014/08/18 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
Python中用Spark模块的使用教程
2015/04/13 Python
python实现简单多人聊天室
2018/12/11 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
python做反被爬保护的方法
2019/07/01 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
Python图像读写方法对比
2020/11/16 Python
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
2014年司法局工作总结
2014/12/11 职场文书
小学端午节活动总结
2015/02/11 职场文书
涨价通知怎么写
2015/04/23 职场文书
高三化学教学反思
2016/02/22 职场文书
简单介绍Python的第三方库yaml
2021/06/18 Python
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏
Python几种酷炫的进度条的方式
2022/04/11 Python