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数据库连接时容易出错的特殊符号问题
Sep 01 PHP
使用PHP实现Mysql读写分离
Jun 28 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
Jun 26 PHP
PHP的魔术常量__METHOD__简介
Jul 08 PHP
四种php中webservice实现的简单架构方法及实例
Feb 03 PHP
form表单传递数组数据、php脚本接收的实例
Feb 09 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
Mar 28 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 PHP
laravel 实现设置时区的简单方法
Oct 10 PHP
laravel 去掉index.php伪静态的操作方法
Oct 12 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
Nov 10 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 mssql 数据库分页SQL语句
2008/12/16 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
2012/07/16 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
js调试工具Console命令详解
2014/10/21 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
jQuery中focus事件用法实例
2014/12/26 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
原生javascript自定义input[type=radio]效果示例
2019/08/27 Javascript
如何使用vue slot创建一个模态框的实例代码
2020/05/24 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
对web.py设置favicon.ico的方法详解
2018/12/04 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
详解anaconda安装步骤
2020/11/23 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
锐步英国官网:Reebok英国
2019/11/29 全球购物
数控机械专业个人的自我评价
2014/01/02 职场文书
励志演讲稿范文
2014/04/29 职场文书
安全生产工作汇报
2014/10/28 职场文书
给老婆的保证书怎么写
2015/05/08 职场文书