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 文件类型判断代码
Mar 13 PHP
php 8小时时间差的解决方法小结
Dec 22 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
Jun 05 PHP
PHP 飞信好友免费短信API接口开源版
Jul 22 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
May 29 PHP
记录PHP错误日志 display_errors与log_errors的区别
Oct 09 PHP
php有道翻译api调用方法实例
Dec 22 PHP
YiiFramework入门知识点总结(图文教程)
Dec 28 PHP
PHP 验证身份证是否合法的函数
Feb 09 PHP
PHP反射原理与用法深入分析
Sep 28 PHP
PHP中类与对象功能、用法实例解读
Mar 27 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
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
php获取发送给用户的header信息的方法
2015/03/16 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
javascript 关闭IE6、IE7
2009/06/01 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
使用jspdf生成pdf报表
2015/07/03 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
详解Vue打包优化之code spliting
2018/04/09 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
Python设计模式之观察者模式简单示例
2018/01/10 Python
教你使用python实现微信每天给女朋友说晚安
2018/03/23 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
解决python 文本过滤和清理问题
2019/08/28 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
施工资料员的岗位职责
2013/12/22 职场文书
校园标语大全
2014/06/19 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
社团招新宣传语
2015/07/13 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
go:垃圾回收GC触发条件详解
2021/04/24 Golang
Django路由层如何获取正确的url
2021/07/15 Python