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 相关文章推荐
FCKeditor添加自定义按钮
Mar 27 PHP
php gzip压缩输出的实现方法
Apr 27 PHP
解析PHP中的unset究竟会不会释放内存
Jul 18 PHP
php生成图形(Libchart)实例
Nov 06 PHP
跟我学Laravel之路由
Oct 15 PHP
Laravel 5 框架入门(三)
Apr 09 PHP
php循环table实现一行两列显示的方法
Jun 04 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
Nov 22 PHP
PHP里的$_GET数组介绍
Mar 22 PHP
PHP MVC框架中类的自动加载机制实例分析
Sep 18 PHP
TP5框架简单登录功能实现方法示例
Oct 31 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你的验证码安全码?
2007/01/02 PHP
php array_pop 删除数组最后一个元素实例
2016/11/02 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
js+html5实现canvas绘制镂空字体文本的方法
2015/06/05 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
JavaScript程序中实现继承特性的方式总结
2016/06/24 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
element ui分页多选,翻页记忆的实例
2019/09/03 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
Python3编程实现获取阿里云ECS实例及监控的方法
2017/08/18 Python
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
利用python为运维人员写一个监控脚本
2018/03/25 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
房屋租赁合同补充协议
2014/10/11 职场文书
大学生党员自我评价
2015/03/04 职场文书
催款函范文
2015/06/24 职场文书
小学一年级班主任工作经验交流材料
2015/11/02 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL
MySQL数据库表约束讲解
2022/06/21 MySQL