<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head><meta forua="true" http-equiv="Cache-Control" content="max-age=0" /></head>
<card title="php实现压缩来自网络的文件，不用保存临时文件，通过调用nginx的第三方模块mod_zip " id="card1">
<p> 游客</p><p>
标题:php实现压缩来自网络的文件，不用保存临时文件，通过调用nginx的第三方模块mod_zip <br/>
正文:<br/>
php 本身有 zip 模块，可以生产 zip 文件。但是这个 zip 模块只能使用本地文件来打包。如果需要打包输出的文件来自网络，就得先保存临时文件。在文件数量多或者文件大的时候就很杯具。另外，由 php 来输出大的打包文件会占用 php 进程大量时间，影响并发能力。nginx 有一个第三方模块，mod_zip 。同样可以输出 zip 包。和 X-Accel-Redirect 有点类似，只需要 php 输出相应文件的路径等信息，然后给一个特殊的响应头即可。nginx zip 模块使用的响应头是 X-Archive-Files: zip 。加上这个响应头，nginx zip 模块就会处理响应正文，完成打包输出。比如：代码如下:printf(&quot;%s %d %s %s\n&quot;, $crc32, $size, $url, $path );<br/>逐条输出要打包的文件。$crc32 是 16 进制的文件 crc32 值。也可以不提供，用 “-” 代替。不过这样就没法用 Range 分块下载，断点续传了。<br/>$size 是文件大小的十进制整数。<br/>$url 是要打包的源地址。如果要打包一个本地文件，可以先在 nginx 中做一个 internal path。<br/>$path 是 zip 包中的路径。不过这样没法创建空目录。一方面，zip 格式开始就没有定义空目录，后来的标准和软件都是通过加一个 / 结尾的 0 大小文件来实现的。这时，就需要先在 nginx 中做一个 internal 的 0 大小文件，比如位于 /_0 。然后输出代码如下:printf(&quot;%s %d %s %s\n&quot;, '00000000', 0, '/_0', $path.'/');<br/>如果要支持中文路径，可以使用 X-Archive-Charset: utf8 这样的响应头，内容为你输出的编码。nginx zip 模块会按标准转换成 utf8 的标准格式。不过各个软件对这个 zip 的标准支持不一，比如 windows 的 zip 目录就不支持，只能以 gbk 编码直接输出。其他软件对编码支持效果也各不相同。测试过的 winrar，7zip，windows zip 目录中，winrar 倒是都可以很好支持。7zip 可能会把部分中文空目录变成 0 大小文件。所以，这点还需要自己斟酌处<br/><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1633&amp;Page=1">[&lt;&lt;]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1633&amp;Page=1">[[1]]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1633&amp;Page=2">[2]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1633&amp;Page=2">[&gt;&gt;]</a><br/>
<br/>
<a href="wap.asp?act=Com&amp;id=1633">查看评论(0)</a><br/>
<a href="wap.asp?act=AddCom&amp;inpId=1633">发表评论</a><br/><br/>

<br/>

<br/>
<a href="http://camnpr.com/wap.asp">首页</a>
</p>
</card>
</wml>