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中几种常见安全设置详解
Apr 06 PHP
php下网站防IP攻击代码,超级实用
Oct 24 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
Oct 31 PHP
PHP SPL使用方法和他的威力
Nov 12 PHP
php实现天干地支计算器示例
Mar 14 PHP
ThinkPHP使用心得分享-分页类Page的用法
May 15 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
Oct 01 PHP
PHP函数实现分页含文本分页和数字分页
Oct 23 PHP
PHP传参之传值与传址的区别
Apr 24 PHP
PHP 返回13位时间戳的实现代码
May 13 PHP
PHP实现websocket通信的方法示例
Aug 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
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
2019/05/06 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
Three.js源码阅读笔记(物体是如何组织的)
2012/12/27 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
python实现文件快照加密保护的方法
2015/06/30 Python
回调函数的意义以及python实现实例
2017/06/20 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
python验证码图片处理(二值化)
2019/11/01 Python
对tensorflow中的strides参数使用详解
2020/01/04 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
浅谈Python中的继承
2020/06/19 Python
Python在后台自动解压各种压缩文件的实现方法
2020/11/10 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
薪酬专员岗位职责
2014/02/18 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
建筑专业毕业生自荐信
2014/05/25 职场文书
企业负责人任命书
2014/06/05 职场文书
HR求职自荐信范文
2014/06/21 职场文书
工作调动申请报告
2015/05/18 职场文书
导游词之西安大清真寺
2019/12/17 职场文书