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


Posted in PHP onMay 10, 2014

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

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

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

记得要开启 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 相关文章推荐
PHPExcel读取Excel文件的实现代码
Dec 06 PHP
PHP高级对象构建 多个构造函数的使用
Feb 05 PHP
php牛逼的面试题分享
Jan 18 PHP
php并发对MYSQL造成压力的解决方法
Feb 21 PHP
CodeIgniter CLI模式简介
Jun 17 PHP
PHP strtotime函数用法、实现原理和源码分析
Feb 04 PHP
smarty模板引擎基础知识入门
Mar 30 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
Jul 01 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
php实现的网页版剪刀石头布游戏示例
Nov 25 PHP
Laravel实现搜索的时候分页并携带参数
Oct 15 PHP
php使用正则过滤js脚本代码实例
May 10 #PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
May 10 #PHP
php中curl和file_get_content的区别
May 10 #PHP
php实现文件下载功能的几个代码分享
May 10 #PHP
php按百分比生成缩略图的代码分享
May 10 #PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
May 10 #PHP
php下获取http状态的实现代码
May 09 #PHP
You might like
PHP实现采集程序原理和简单示例代码
2007/03/18 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
Javascript代码混淆综合解决方案-Javascript在线混淆器
2006/12/18 Javascript
js 上传图片预览问题
2010/12/06 Javascript
纯css实现窗户玻璃雨滴逼真效果
2015/08/23 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
2018/07/30 Javascript
Vue实现简单的留言板
2020/10/23 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
在Django框架中编写Context处理器的方法
2015/07/20 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
Python中extend和append的区别讲解
2019/01/24 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
django ManyToManyField多对多关系的实例详解
2019/08/09 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
python随机数分布random均匀分布实例
2019/11/27 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
Python tcp传输代码实例解析
2020/03/18 Python
如何在Django中使用聚合的实现示例
2020/03/23 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
军校大学生个人的自我评价
2014/02/17 职场文书
作文评语集锦大全
2014/04/23 职场文书
2014年党务公开方案
2014/05/08 职场文书
环境整治工作方案
2014/05/18 职场文书
2014年技术部工作总结
2014/12/12 职场文书
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL