php实现zip压缩文件解压缩代码分享(简单易懂)

 更新时间:2014年05月10日 10:24:16   作者:  
这篇文章主要介绍了php的zip压缩文件解压缩实现代码,需要的朋友可以参考下

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

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

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

源码范例:

复制代码 代码如下:

<?php

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

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

 //将文件名和路径转成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>";
}

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

?>

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

相关文章

  • php写的AES加密解密类分享

    php写的AES加密解密类分享

    这篇文章主要介绍了php写的AES加密解密类,实际是为YII框架写的,不在YII框架时只需替换其中的两句代码即可使用,需要的朋友可以参考下
    2014-06-06
  • php中PDO方式实现数据库的增删改查

    php中PDO方式实现数据库的增删改查

    PDO是mysql数据库操作的一个公用类了,我们不需要进行自定类就可以直接使用pdo来操作数据库了,但是在php默认配置中pdo是未开启所以我们必须先在php.ini中开启它才可以使用。
    2015-05-05
  • Laravel框架实现定时Task Scheduling例子

    Laravel框架实现定时Task Scheduling例子

    今天小编就为大家分享一篇Laravel框架实现定时Task Scheduling例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • py文件转exe时包含paramiko模块出错解决方法

    py文件转exe时包含paramiko模块出错解决方法

    这篇文章主要介绍了py文件转exe时包含paramiko模块出错解决方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • WordPress中设置Post Type自定义文章类型的实例教程

    WordPress中设置Post Type自定义文章类型的实例教程

    这篇文章主要介绍了WordPress中设置Post Type自定义文章类型的实例教程,后台文章类型的设置是WordPress的一大特色,然而自带的文章类型往往并不够用,需要的朋友可以参考下
    2016-05-05
  • PHP 对象继承原理与简单用法示例

    PHP 对象继承原理与简单用法示例

    这篇文章主要介绍了PHP 对象继承原理与简单用法,结合实例形式分析了PHP面向对象程序设计中对象继承的概念、原理与相关操作注意事项,需要的朋友可以参考下
    2020-04-04
  • PHP实现微信商户支付企业付款到零钱功能

    PHP实现微信商户支付企业付款到零钱功能

    这篇文章主要为大家详细介绍了PHP实现微信商户支付企业付款到零钱功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • PHP7 echo和print语句实例用法

    PHP7 echo和print语句实例用法

    在本文中小编整理了在PHP7中echo和print语句实例用法以及相关知识点内容,需要的学习下。
    2019-02-02
  • PHP基于yii框架实现生成ICO图标

    PHP基于yii框架实现生成ICO图标

    本文给大家分享了2则php生成ICO图标的代码,第一款是基于YII框架实现的,第二款是纯php编写,都非常的不错,有需要的小伙伴可以参考下
    2015-11-11
  • ThinkPHP3.2.3框架Memcache缓存使用方法实例总结

    ThinkPHP3.2.3框架Memcache缓存使用方法实例总结

    这篇文章主要介绍了ThinkPHP3.2.3框架Memcache缓存使用方法,结合实例形式总结分析看thinkPHP框架下Memcache缓存各种调用方法与配置相关操作技巧,需要的朋友可以参考下
    2019-04-04

最新评论