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 相关文章推荐
将CMYK颜色值和RGB颜色相互转换的PHP代码
Jul 28 PHP
php实现模拟登陆方正教务系统抓取课表
May 19 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
Sep 20 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
PHP生成制作验证码的简单实例
Jun 12 PHP
PHP入门教程之面向对象基本概念实例分析
Sep 11 PHP
php通过会话控制实现身份验证实例
Oct 18 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
php curl批处理实现可控并发异步操作示例
May 09 PHP
PHP中上传文件打印错误错误类型分析
Apr 14 PHP
laravel实现前后台路由分离的方法
Oct 13 PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 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伪静态写法附代码
2008/06/20 PHP
php的urlencode()URL编码函数浅析
2011/08/09 PHP
php中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
PHP解析html类库simple_html_dom的转码bug
2014/05/22 PHP
PHP之图片上传类实例代码(加了缩略图)
2016/06/30 PHP
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
2020/11/10 Javascript
python 用lambda函数替换for循环的方法
2018/06/09 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
建筑公司文秘岗位职责
2013/11/29 职场文书
校园环保建议书
2014/05/14 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
2015年路政工作总结
2015/05/22 职场文书
2015年女工委工作总结
2015/07/27 职场文书
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS
python编程实现清理微信重复缓存文件
2021/11/01 Python