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中删除变量时unset()和null的区别分析
Jan 27 PHP
PHP array_multisort()函数的使用札记
Jul 03 PHP
显示程序执行时间php函数代码
Aug 29 PHP
php preg_replace替换实例讲解
Nov 04 PHP
php如何实现只替换一次或N次
Oct 29 PHP
php实现scws中文分词搜索的方法
Dec 25 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
PHP递归遍历指定文件夹内的文件实现方法
Nov 15 PHP
Zend Framework数据库操作方法实例总结
Dec 11 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
实例讲解PHP表单验证功能
Feb 15 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
Feb 28 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
JavaScript实现删除电脑的关机键
2016/07/26 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
javascript下过滤数组重复值的代码
2007/09/10 Javascript
详细讲解JS节点知识
2010/01/31 Javascript
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
js禁止表单重复提交
2017/08/29 Javascript
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
[06:25]第二届DOTA2亚洲邀请赛主赛事第二天比赛集锦.mp4
2017/04/03 DOTA
python 读取二进制 显示图片案例
2020/04/24 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
市场策划求职信
2014/08/07 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
2016年少先队活动总结
2016/04/06 职场文书
Python爬取某拍短视频
2021/06/11 Python
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android
python游戏开发Pygame框架
2022/04/22 Python