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缩略图生成程式(需要GD库支持)
Mar 06 PHP
php5新改动之短标记启用方法
Sep 11 PHP
php数组去重的函数代码
Feb 03 PHP
php解析html类库simple_html_dom(详细介绍)
Jul 05 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
Jan 07 PHP
PHP使用ODBC连接数据库的方法
Jul 18 PHP
Laravel路由设定和子路由设定实例分析
Mar 30 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
浅谈PHP的反射机制
Dec 15 PHP
php str_getcsv把字符串解析为数组的实现方法
Apr 05 PHP
php实现QQ小程序发送模板消息功能
Sep 18 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 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中操作Excel实例代码
2010/04/29 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
jQuery 入门讲解1
2009/04/15 Javascript
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
javascript 节点排序 2
2011/01/31 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
Javascript让DEDECMS告别手写Tag
2014/09/01 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
简单的三步vuex入门
2018/05/20 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
Layui表格监听行单双击事件讲解
2019/11/14 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python之import机制详解
2014/07/03 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
python+flask实现API的方法
2018/11/21 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
2019/09/25 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
IT工程师岗位职责
2014/07/04 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
Python面向对象之成员相关知识总结
2021/06/24 Python