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 相关文章推荐
一个简洁的多级别论坛
Oct 09 PHP
提高define性能的php扩展hidef的安装和使用
Jun 14 PHP
php取整函数ceil,floo,round的用法及介绍
Aug 31 PHP
php中引用符号(&)的使用详解
Nov 13 PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 PHP
destoon实现调用图文新闻的方法
Aug 21 PHP
php实现的一个简单json rpc框架实例
Mar 30 PHP
php基于双向循环队列实现历史记录的前进后退等功能
Aug 08 PHP
Codeigniter控制器controller继承问题实例分析
Jan 19 PHP
PHP模拟http请求的方法详解
Nov 09 PHP
如何在centos8自定义目录安装php7.3
Nov 28 PHP
PHP的垃圾回收机制代码实例讲解
Feb 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
php 常用字符串函数总结
2008/03/15 PHP
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
JS的Document属性和方法小结
2013/09/17 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
Vant picker 多级联动操作
2020/11/02 Javascript
vue 判断页面是首次进入还是再次刷新的实例
2020/11/05 Javascript
Python操作列表的常用方法分享
2014/02/13 Python
浅谈python数据类型及类型转换
2017/12/18 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
keras分类模型中的输入数据与标签的维度实例
2020/07/03 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
30岁生日感言
2014/01/25 职场文书
参观考察邀请函范文
2014/01/29 职场文书
学习决心书范文
2014/03/11 职场文书
大学新闻系自荐书
2014/05/31 职场文书
八荣八耻的活动方案
2014/08/16 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
2015年大学生实习评语
2015/03/25 职场文书
探讨Java中的深浅拷贝问题
2021/06/26 Java/Android