首页 > 编程技术 > php

php ZipArchive类创建和解压zip文件实例

发布时间:2016-11-25 15:45

如果你使用的是php5.2以下的php版本是无法使用ZipArchive类的,只要php5.2及以上版本才可以方便的使用ZipArchive类来解压与压缩zip文件了,下面小编来给各位同学介绍一下。

也能直接读取zip压缩包内的内容,很方便,这里主要总结下读取和解压的过程。

解压一个包到指定目录

 代码如下 复制代码
<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
  $zip->extractTo('/my/destination/dir/');
  $zip->close();
  echo 'ok';
} else {
  echo 'failed';
}
?>

 
如果只是需要读取包中某个文件的内容,需要文件名或者文件的索引值。

 

 代码如下 复制代码
<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
  echo $zip->getFromName('example.php');
  $zip->close();
}
?>


如果example.php在某目录下,获取内容时需要加上路径。

如果只知道文件名,而不知到文件的具体路径,可以搜索指定文件名的索引,再依靠索引获取内容。

 

 代码如下 复制代码
<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
  $index=$zip->locateName('example.php', ZIPARCHIVE::FL_NOCASE|ZIPARCHIVE::FL_NODIR);
  $contents = $zip->getFromIndex($index);
}
?>

 
上面获取索引依靠 locateName方法,如果压缩包内多个路径下有同名文件,好像只能返回第一个的索引,如果要获取所有同名文件的索引,只能使用笨办法,循环搜索。

 代码如下 复制代码

<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
 for($i = 0; $i < $zip->numFiles; $i++)
   {
     if(substr_count($zip->getNameIndex($i), 'example.php')>0){
       $contents = $zip->getFromIndex($i);            
      }
   }
}
?>

本人测试的是php5.3版本哦,测试没有任何问题并且压缩zip 文件比以前的 zip命令要快多了。

在php中如果要实现多文件上传我们只要遍历表单就基本实现了一半,下面小编来给大家介绍PHP中上传多个文件到服务器实例,希望此方法对各位有用。

实例说明

上传图片到服务器,是程序开发过程中必不可少的一个功能。它不但可以达到图片共享的目的,而且可以提高网站的访问量,丰富网站的内容。在本实例中,讲解如何通过POST方式实现多图片上传。

关键技术

多文件上传的关键是如何定义上传文件元素的名称及如何判断上传文件的数量。在本实例中,以数组的形式定义上传文件的名称(上传文件的名称是“files[]”)。为了达到可以上传任意数量图片(4个图片以内)的目的,在对上传文件进行处理的过程中应用array_filter()函数和回调函数去除数组中的空元素。

  array_filter()函数,用回调函数过滤数组中的单元,语法如下:
  array array_filter(array input[,callback callback])


  array_filter()函数依次将input数组中的每个值传递到callback函数。如果callback函数返回TRUE,则input数组的当前值会被包含在返回的结果数组中,并且数组的键名保留不变。
  说明:在回调函数中不要对数组进行修改操作,例如,增加或者删除数组中的元素,如果一旦数组改变,那么此函数的运用也就没有意义了。如果没有提供callback()函数,array_filter()将删除input中本实例中定义的回调函数是check(),用于验证数组中的元素值是否为空,其语法如下:

 代码如下 复制代码


function check($var){//验证数组的返回值是否为空
          return($var!="");
  }

说明:通过POST方法实现多图片上传,在创建form表单时,必须指定enctype="multipart/form-data"属性。如果要通过隐藏域MAX_FILE_SIZE的值对上传文件的大小进行控制,那么必须将隐藏放置在上传文件的文件域之前,否则是不会起作用的。
设计过程


  (1)创建index.php文件。添加表单,设置文件域、提交按钮,使用POST方法,设置enctype="multipart/form-data",将数据提交到index_ok.php页,完成多个文件的上传操作,其关键代码如下:

 代码如下 复制代码

  <table width="750"border="0"cellspacing="0"cellpadding="0">
        <form action="index_ok.html"method="post"enctype="multipart/form-data"name="form1">
           <tr>
             <td width="100"height="25"align="right"class="STYLE1">内容1:</td>
             <td width="150"align="center"><input name="files[]"type="text"id="files[]"size="15"></td>
             <td align="left"><input name="picture[]"type="file"id="pcture[]"size>="30"></td>
           </tr>
           <tr>
             <td height="25"align="right"class="STYLE1">内容2:</td>
             <td width="center"><input name="files[]"type="text"id="files[]"size="15"></td>
             <td align="left"><input name="picture[]"type="file"id="pcture[]"size>="30"></td>
           </tr>
         <tr>
            <td colspan="3"align="center">
                 <input type="image"name="imageField"src="images/bg_09.jpg">&nbsp;&nbsp;&nbsp;&nbsp;
                 <input type="image"name="imgeField2"src="images/bg_11.jpg"></td>
            </tr>
          </form>
         </table>


    (2)在index.php文件中,连接数据库,读取数据库中存储的数据,实现上传文件的分页输出。代码请参考光盘中的相关内容。
    (3)创建index.php文件获取表单中提交的数据,将多个文件存储到服务器中,将文件的名称和存储路径存储到数据库中,其代码如下:

 代码如下 复制代码


<?php
    header("Content-type:text/html;charset=UTF-8");     //设置文件编码格式
    include"conn/conn.php";                             //包含数据库链接文件
    if($_POST[files]!=""){
          if(! is_dir("./upfile")){
                  mkdir("./upfile");                    //创建上传文件存储文件夹
          }
          $data=date("Y-m-d H:m:s");                    //定义时间
          function check($var){                         //验证数组的返回值是否为空
                     return($var!="");                  //如果不为空则返回数组元素
          }
          $files=array_filter($_POST["files"],"check");  //去除数组中空值
          $array=array_filter($_FILES["picture"]["name"],"check"); //去除数组中空值
          foreach=($aarray as $key=>value){             //循环读取数组中数据
                 $path='upfile/'.time().$key.strtolower(strstr($value,".")); //定义上传文件存储位置
                 move_uploaded_file($_FILES["picture"]["tmp_name"][$key],$path);  //执行上传操作
                 $query="insert into tb_up_file(file_test,data,file_name)values('$path','$data''$files[$key]')";
                 $result=mysql_query($query);
          }
          echo"<script>
          alert('图片上传成功');window.location.href='index.html';</script>";
         }
         ?>

在php中memcache是一个缓存功能,可以提高数据访问性能同时减少机器负载,下面我来介绍php中memcache优化方法吧。

memcache support enabled
Active persistent connections 0
Revision $Revision: 1.92 $

Directive Local Value Master Value
memcache.allow_failover 1 1
memcache.chunk_size 8192 8192
memcache.default_port 11211 11211
memcache.hash_function crc32 crc32
memcache.hash_strategy standard standard
memcache.max_failover_attempts 20 20

 在网上找到php的memcache模块的优化方面的部分资料,贴出来备忘.

 代码如下 复制代码

vi /etc/php.d/memcache.ini
[Memcache]
; Enable memcache extension module
extension=memcache.so
memcache.allow_failover = "1"
memcache.max_failover_attempts = "20"
memcache.chunk_size = "8192"
memcache.default_port = "11211"
memcache.hash_strategy = "standard"
memcache.hash_function = "crc32"

ps:

 代码如下 复制代码
memcache.allow_failover = "1"

一个布尔值,用于控制当连接出错时 Memcache 扩展是否故障转移到其他服务器上.默认值为 1 (true).

 代码如下 复制代码

memcache.max_failover_attempts = "20"

一个整型值,用于限制连接到持久性数据或检索数据的服务器数目.如果 memcache.allow_failover 为 false,则将忽略此参数.默认值为 20.

 代码如下 复制代码
memcache.chunk_size = "8192"

一个整型值,用于控制数据传输的大小.默认值为 8192 字节 (8 KB),但是如果设置为 32768 (32 KB),则可以获得更好的性能.

 代码如下 复制代码

memcache.default_port = "11211"

另一个整型值,用于设置连接到 Memcache 所使用的 TCP 端口.除非您修改它,否则默认值为无特权的高端口 11211.

 代码如下 复制代码

memcache.hash_strategy = "standard"

哈希策略,目前有standard模式和consistent模式.standard模式其实就是%,即取模.而consistent,就比较复杂, memcache.hash_function = "crc32"
控制哪种 hsah 函数被应用于 key映射 到服务器过程中,默认值“crc32”使用 CRC32 算法,而“fnv”则表示使用 FNV-1a 算法.

测试memcache

 代码如下 复制代码

<?php
$mc = new Memcache;
$mc->connect("127.0.0.1",11211);
$item = $mc->get('item');
if(!is_array($item)){
echo "Add item to memcache";
$mc->add('item',array('item'));
}
$item = $mc->get('item');
var_dump($item);
?>

最后,祝您成功提升服务器性能,网站运营如日中天

开发者认证实例,希望此实例对各位有所帮助。

微信公众平台如何成为开发者?

登录微信公众平台后,点击高级功能=》开发模式=》成为开发者=》填写接口配置信息,提交后等待我司工作人员的审核。


1.开发者认证

这个最简单了,直接上个超简单版代码:

 代码如下 复制代码

exit($_GET['echostr']);

php文件就写上面这一句就行,微信公共平台随便填写token,写上php文件的url,然后验证即可通过。超级简单吧?官方的认证根本没有必要,因为后面的步骤没有使用的验证签名的地方,所以这个地方为了图方便直接输出返回值轻松通过验证。当然下面也给出官方要求的认证代码:

 代码如下 复制代码

$token='11';
$signarr=array($token,$_GET['timestamp'],$_GET['nonce']);
if($this-&gt;signnature($signarr,$_GET['signature'])){
   exit($_GET['echostr']);
}
function signnature($arr,$signature){
   sort($arr);
   if(sha1(implode($arr))==$signature) return true;
   return false;
}

把上面的代码保存成php文件,在微信公共平台设置同样的token,然后验证即可通过。

注:url是允许带get参数的

网址接入

公众平台用户提交信息后,我们将以GET请求方式请求到填写的Url上,并且带上四个参数:

* signature — 微信加密签名
* timestamp — 时间戳
* nonce — 随机数
* echostr — 随机字符串

开发者通过检验signature对网址接入合法性进行校验。若此次GET请求原样返回echostr参数内容,则接入生效,否则接入失败。  验证signature将结合开发者填写的token参数、timestamp

参数和nonce参数等,加密流程:
* 将token、timestamp、nonce三个参数进行字典序排序
* 将三个参数字符串拼接成一个字符串进行sha1加密
* 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。

在php中条件控制语包括了if语句、swicth语句、三无操作符等下面小编来给大家总结它们三个在php中的一些应用实例了,希望此教程对各位朋友有所帮助。

PHP条件控制语句一共有三种:

第一种:if语句;

第二种:switch语句;

第三种:三元操作符;

分别讲解下这三种条件控制语句。

第一种:if语句。


if语法有以下几种格式:

1)、

if (表达式一) {  //满足条件执行以下程序段

执行语句;
}

例如:

 代码如下 复制代码

<?php

if ($a > $b) {
echo "a is bigger than b";
$b = $a;
}
?>

2)、

if (表达式一){   //满足条件执行以下程序段

执行语句;

}

else{        //不满足执行如下程序段

执行语句;

}

例如:

 代码如下 复制代码

<?php
if ($a > $b) {
echo "a is bigger than b";
} else {
echo "a is NOT bigger than b";
}
?>

3)、if (表达式一) {   //满足条件执行以下程序段

}elseif  (表达式二)  {

}else {

}

例如:

 代码如下 复制代码

<?php

$a=45;

$b=50;

if ($a>$b)      {  print  “a大于b”;  }

elseif ($a==$b)      {  print  “a等于b”;  }

else      {  print “a小于b”;  }

?>

 

第二种:switch语句。

Switch是多路分支语句,虽然可以通过多重嵌套的if语句来实现多路分支,但嵌套越深,程序的可读性越差。使用 Switch 语句可以避免冗长的 if..elseif..else 代码块。

Switch语句的语法

switch (var) {
case 值1:
语句1;
   break;
case 值2:

语句2;
   break;
case 值N:

语句N;
   break;
default:

语句;

}

例如:

 代码如下 复制代码

<?php

$i=1;

switch ($i) {
case 0:
echo  "i equals 0";
break;
case 1:
echo   "i equals 1";
break;
case 2:
echo   "i equals 2";
break;

default:
echo   "i no equals";
break;
}
?>

第三种:三元操作符。

PHP脚本语言支持操作符?:,它是if语句的紧凑版本。我们可以用下面的实例来对该三元操作符进行解释:


三元操作符语法:

(条件)?’执行语句1′:’执行语句2′;

解释为:如果条件为TRUE则执行语句1,如果条件为FALSE则执行语句2;

例如:

 代码如下 复制代码

echo  ($a>$b)?“a大于b”:“a不大于b”;

解释为:

如果$a>$b,则输入a大于b;如果$a<$b,则输入a不大于b。

标签:[!--infotagslink--]

您可能感兴趣的文章: