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 Squid中可缓存的动态网页设计
Sep 17 PHP
Array of country list in PHP with Zend Framework
Oct 17 PHP
LotusPhp笔记之:Cookie组件的使用详解
May 06 PHP
Smarty中的注释和截断功能介绍
Apr 09 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
Aug 18 PHP
ThinkPHP5 验证器的具体使用
May 31 PHP
php微信公众号开发之简答题
Oct 20 PHP
PHP观察者模式定义与用法实例分析
Mar 22 PHP
Yii框架函数简单用法分析
Sep 09 PHP
php post换行的方法
Feb 03 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实现微信公众平台发红包功能
2018/06/14 PHP
php json转换相关知识(小结)
2018/12/21 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
jQuery制作网页版选项卡
2016/07/28 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
JavaScript编程设计模式之构造器模式实例分析
2017/10/25 Javascript
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
Python 装饰器深入理解
2017/03/16 Python
Python语言的变量认识及操作方法
2018/02/11 Python
python并发和异步编程实例
2018/11/15 Python
从0开始的Python学习016异常
2019/04/08 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
介绍CSS3使用技巧5个
2009/04/02 HTML / CSS
让IE可以变相支持CSS3选择器
2010/01/21 HTML / CSS
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
护理专科毕业推荐信
2013/11/10 职场文书
会计专业毕业生自荐信范文
2013/12/20 职场文书
小学英语教学反思
2014/01/30 职场文书
销售经理工作职责
2014/02/03 职场文书
作文评语集锦大全
2014/04/23 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
校园新闻稿范文
2015/07/18 职场文书
Python 制作自动化翻译工具
2021/04/25 Python
MySQL查询学习之基础查询操作
2021/05/08 MySQL
python中的sys模块和os模块
2022/03/20 Python
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android