首页 > 编程技术 > php

PHP判断文件是否被修改实例

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

在网站的管理系统中,有时需要查看某个文件是否被修改过、在什么时间被修改的、最后的修改时间是什么时候,本实例就可以实现这个功能,对表单中提交的文件进行判断,检测出修改时间。


关键技术

   本实例主要应用filectime()和filemtime()函数,检测文件的incode最后改变时间和最后的修改时间,并应用date()函数对检测返回的时间戳进行格式化。
   filectime()函数,返回指定文件filename的inode最后改变时间,语法如下:
   int filectime(string filename);
   成功则返回UNIX时间戳,否则返回FALSE。
   filemtime()函数,返回指定文件filename的最后修改时间,语法如下:
   成功则返回UNIX时间戳,否则返回FALSE。
设计过程
  首先,设计网页页面。然后,创建一个表单,通过文件域提交要判断的文件。接着,获取表单中提交的文件路径,应用filectime()和filemtime()函数对提交的文件进行检测。最后,输出检测结果。
  index.php文件的关键代码如下:

 代码如下 复制代码


<?php
  $file=iconv("utf-8","gb2312",$_POST['files']);           //实现编码格式的转换
  if(file_exists($file)){                                  //判断文件是否存在
          $change_time=filectime($file);                   //获取文件的最后incode时间
          $time=date("Y-m-d h:i:s",$change_time);          //时间戳的格式化
          $last_time=filemtime($file);                     //获取文件的最后修改时间
          $times=date("Y-m-d h:i:s",$last_time);           //时间戳的格式化
   }else{
          $result="该文件不存在";
   }
   ?>


秘笈心法
  获取文件的最后访问时间。
  通过文件系统函数不但可以获取文件的最后修改时间,而且可以获取文件的最后访问时间,其应用的是fileatime()函数

本文章来给大家介绍关于php 字符串和数字比较一些问题,因为数字与字符在php中是不同的数据类型,所以在比较时可能会有很多的问题。

今天遇到一个问题,调用对方接口,按照接口说明,返回为数字0,1,2等等,其中0标示成功,其他表示不同的错误代码。程序通过 if ($ret == 0) 进行判断,开始程序是好的,今天出现问题了,由于对方接口修改,直接返回字母字符串作为错误信息提示,然后我这边就悲剧了,上述判断永远都为TRUE。

原因在于php是弱类型语言,所以可以对两个不同类型的变量进行比较操作,但最终进行比较前,php会把某一方转换称另一方一样的类型,这点很重要。如果是字符串和数字进行比较,那么php会把字符串强制转换称数字,对于纯字母的字符串,那么转换后就是0了,所以if ($ret == 0) 成了。

PHP手册/语言参考/运算符/比较运算符 可以找到.

在PHP里当两个数字型字符串(只含数字的字符串)进行比较的时候是直接转换成数值进行比较的
如下示例:(注意$a和$b两个变量的最后一位不相等)

 

 代码如下 复制代码

//示例1
<?php
$a = '511203199106034578';
$b = '511203199106034579';
if ($a==$b) {
echo 'equal';
} else {
echo 'notEqual';
}
?>

运行上面的程序却发现结果为equal(非我们认为的结果)

我们把$a与$b分别加一个字母a进去

 代码如下 复制代码


//示例2
<?php
$a = 'a511203199106034578';
$b = 'a511203199106034579';
if ($a==$b) {
echo 'equal';
} else {
echo 'notEqual';
}
?>

这次输出的是notEqual(正确的结果)

示例1为equal是因为PHP把两个数字型字符串转换成数字型,而这两个数字刚好相等如下示例

 代码如下 复制代码

<?php
$a = 511203199106034578;
$b = 511203199106034579;
echo $a; // 输出 5.1120319910603E+17 即511203199106030000
echo $b; // 输出 5.1120319910603E+17 即511203199106030000
?>

所以我们在示例1中得到的结果是equal

避免出现这种非预期结果的情况是使用类型比较符===如下示例(如果 $a 等于 $b,并且它们的类型也相同)

 代码如下 复制代码

//示例4
<?php
$a = '511203199106034578';
$b = '511203199106034579';
if ($a===$b) {
echo 'equal';
} else {
echo 'notEqual';
}
?>

这样我们就可以得到预期中的notEqual了

在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>";
         }
         ?>

如果你使用的是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中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);
?>

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

标签:[!--infotagslink--]

您可能感兴趣的文章: