php调用nginx的mod_zip模块打包ZIP文件,php实现zip压缩文件解压缩代码分享

php 本身有 zip 模块,可以生产 zip 文件。但是这个 zip
模块只能使用本地文件来打包。如果需要打包输出的文件来自网络,就得先保存临时文件。在文件数量多或者文件大的时候就很杯具。另外,由
php 来输出大的打包文件会占用 php 进程大量时间,影响并发能力。

php 本身有 zip 模块,可以生产 zip 文件。但是这个 zip
模块只能使用本地文件来打包。如果需要打包输出的文件来自网络,就得先保存临时文件。在文件数量多或者文件大的时候就很杯具。另外,由
php 来输出大的打包文件会占用 php 进程大量时间,影响并发能力。

仔细的研究了一下,原来用php写的解压程序效率比想象的还是高很多的,既然这么好,干脆再优化一下后用到自己后台中,虽然现在大部分空间的控制面板中有压缩和解压这个功能,但是毕竟有时候有些麻烦。

nginx 有一个第三方模块,mod_zip 。同样可以输出 zip 包。和
X-Accel-Redirect 有点类似,只需要 php
输出相应文件的路径等信息,然后给一个特殊的响应头即可。

nginx 有一个第三方模块,mod_zip
。同样可以输出 zip 包。和 X-Accel-Redirect 有点类似,只需要 php
输出相应文件的路径等信息,然后给一个特殊的响应头即可。

做这个之前,没有接触过php压缩这一块,网上搜了一些,大多数都是php压缩类、压缩函数,少则几百行,多的就几千行代码。这对于我这种新手来说很摸不到头脑,再说我也不用这么复杂的功能。最后参考函数手册,理清楚了几个相关的函数后,就明白了怎么去整了。

nginx zip 模块使用的响应头是 X-Archive-Files: zip
。加上这个响应头,nginx zip 模块就会处理响应正文,完成打包输出。

nginx zip 模块使用的响应头是 X-Archive-Files: zip
。加上这个响应头,nginx zip 模块就会处理响应正文,完成打包输出。

图片 1

比如:

比如:

记得要开启 zip ,把 php.ini 中的 extension=php_zip.dll 前面的分号去掉。

复制代码 代码如下:

printf("%s %d %s %s\n", $crc32, $size, $url, $path ); 

**源码范例:

printf(“%s %d %s %s\n”, $crc32, $size, $url, $path );

逐条输出要打包的文件。

**

逐条输出要打包的文件。

$crc32 是 16 进制的文件 crc32 值。也可以不提供,用 “-”
代替。不过这样就没法用 Range 分块下载,断点续传了。
$size 是文件大小的十进制整数。
$url 是要打包的源地址。如果要打包一个本地文件,可以先在 nginx 中做一个
internal path。
$path 是 zip 包中的路径。

复制代码 代码如下:

$crc32 是 16 进制的文件 crc32 值。也可以不提供,用 “-”
代替。不过这样就没法用 Range 分块下载,断点续传了。
$size 是文件大小的十进制整数。
$url 是要打包的源地址。如果要打包一个本地文件,可以先在 nginx 中做一个
internal path。
$path 是 zip 包中的路径。

不过这样没法创建空目录。一方面,zip
格式开始就没有定义空目录,后来的标准和软件都是通过加一个 / 结尾的 0
大小文件来实现的。这时,就需要先在 nginx 中做一个 internal 的 0
大小文件,比如位于 /_0 。然后输出

<?php

不过这样没法创建空目录。一方面,zip
格式开始就没有定义空目录,后来的标准和软件都是通过加一个 / 结尾的 0
大小文件来实现的。这时,就需要先在 nginx 中做一个 internal 的 0
大小文件,比如位于 /_0 。然后输出

printf("%s %d %s %s\n", '00000000', 0, '/_0', $path.'/'); 

//需开启配置 php_zip.dll
//phpinfo();
header(“Content-type:text/html;charset=utf-8”);

复制代码 代码如下:

如果要支持中文路径,可以使用 X-Archive-Charset: utf8
这样的响应头,内容为你输出的编码。nginx zip 模块会按标准转换成 utf8
的标准格式。不过各个软件对这个 zip 的标准支持不一,比如 windows 的 zip
目录就不支持,只能以 gbk
编码直接输出。其他软件对编码支持效果也各不相同。测试过的
winrar,7zip,windows zip 目录中,winrar 倒是都可以很好支持。7zip
可能会把部分中文空目录变成 0 大小文件。所以,这点还需要自己斟酌处理。

function get_zip_originalsize($filename, $path) {
 //先判断待解压的文件是否存在
 if(!file_exists($filename)){
  die(“文件 $filename 不存在!”);
 } 
 $starttime = explode(‘ ‘,microtime()); //解压开始的时间

printf(“%s %d %s %s\n”, ‘00000000’, 0, ‘/_0′, $path.’/’);

 //将文件名和路径转成windows系统默认的gb2312编码,否则将会读取不到
 $filename = iconv(“utf-8″,”gb2312”,$filename);
 $path = iconv(“utf-8″,”gb2312”,$path);
 //打开压缩包
 $resource = zip_open($filename);
 $i = 1;
 //遍历读取压缩包里面的一个个文件
 while ($dir_resource = zip_read($resource)) {
  //如果能打开则继续
  if (zip_entry_open($resource,$dir_resource)) {
   //获取当前项目的名称,即压缩包里面当前对应的文件名
   $file_name = $path.zip_entry_name($dir_resource);
   //以最后一个“/”分割,再用字符串截取出路径部分
   $file_path = substr($file_name,0,strrpos($file_name, “/”));
   //如果路径不存在,则创建一个目录,true表示可以创建多级目录
   if(!is_dir($file_path)){
    mkdir($file_path,0777,true);
   }
   //如果不是目录,则写入文件
   if(!is_dir($file_name)){
    //读取这个文件
    $file_size = zip_entry_filesize($dir_resource);
    //最大读取6M,如果文件过大,跳过解压,继续下一个
    if($file_size<(1024*1024*6)){
     $file_content = zip_entry_read($dir_resource,$file_size);
     file_put_contents($file_name,$file_content);
    }else{
     echo “<p> “.$i++.” 此文件已被跳过,原因:文件过大, ->
“.iconv(“gb2312″,”utf-8″,$file_name).” </p>”;
    }
   }
   //关闭当前
   zip_entry_close($dir_resource);
  }
 }
 //关闭压缩包
 zip_close($resource); 
 $endtime = explode(‘ ‘,microtime()); //解压结束的时间
 $thistime =
$endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);
 $thistime = round($thistime,3); //保留3为小数
 echo “<p>解压完毕!,本次解压花费:$thistime 秒。</p>”;
}

如果要支持中文路径,可以使用 X-Archive-Charset: utf8
这样的响应头,内容为你输出的编码。nginx zip 模块会按标准转换成 utf8
的标准格式。不过各个软件对这个 zip 的标准支持不一,比如 windows 的 zip
目录就不支持,只能以 gbk
编码直接输出。其他软件对编码支持效果也各不相同。测试过的
winrar,7zip,windows zip 目录中,winrar 倒是都可以很好支持。7zip
可能会把部分中文空目录变成 0 大小文件。所以,这点还需要自己斟酌处理。

$size = get_zip_originalsize(‘20131101.zip’,’temp/’);

您可能感兴趣的文章:

  • php将文件夹打包成zip文件的简单实现方法
  • php实现zip文件解压操作
  • php生成zip文件类实例
  • php操作(删除,提取,增加)zip文件方法详解
  • php在线解压ZIP文件的方法
  • php实现的zip文件内容比较类
  • php
    解压rar文件及zip文件的方法
  • 将文件夹压缩成zip文件的php代码
  • php zip文件解压类代码
  • php对gzip文件或者字符串解压实例参考
  • 真正的ZIP文件操作类(php)
  • PHP读取zip文件的方法示例

?>

测试解压了一个300多KB的小文件,花了0.115秒,测试解压了一个30多MB的(网页文件,小文件比较多),花了20多秒。

您可能感兴趣的文章:

  • PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
  • 将文件夹压缩成zip文件的php代码
  • PHP 压缩文件夹的类代码
  • php生成zip压缩文件的方法详解
  • PHP Zip压缩
    在线对文件进行压缩的函数
  • php启用zlib压缩文件的配置方法
  • PHP Zip解压
    文件在线解压缩的函数代码
  • php文件打包
    下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
  • php压缩文件夹最新版