PHP测试glob与readdir两种遍历目录文件运行效率

文章作者:中山市飞娥软件工作室「Feiesoft.com」  浏览次数:7020 次  更新日期:2013-10-26

第一步:建立10000个测试文件

<?php

 $max_file_count = 10000;

 $cur_file_count = 0;

 $cur_file_index = $max_file_count;

 $file_output_path = 'md5';

 $file_buffer = md5('http://www.feiesoft.com/');

 

 if(file_exists($file_output_path)){

  delete_dir($file_output_path);

 }

 

 if(mkdir($file_output_path)){

  while($cur_file_index--){

   $file_name = $file_output_path . '\\' . str_pad($cur_file_index,5,'0',STR_PAD_LEFT) . '.md5';

   if(file_put_contents($file_name,$file_buffer)){

    $cur_file_count++;

   }

   

  }

  echo "任务结束,共建立 $cur_file_count 个文件于目录 $file_output_path 下。<a href='tree.php'>进行下一步测试</a>";

 }

 

 //删除目录

 function delete_dir($dir_name){

  $dir_haddle = opendir($dir_name);

  while(false !== ($file = readdir($dir_haddle))){

   if($file != '.' && $file != '..'){

    $full_path = $dir_name . '/' . $file;

    if(!is_dir($full_path)){

     unlink($full_path);

    }else{

     delete_dir($full_path);

    }

   }

  }

  closedir($dir_haddle);

  return rmdir($dir_name);

 }

第二步:测试两种遍历目录文件方法的运行效率

<?php
 set_time_limit(0);
 
 for($i = 1; $i <= 5; $i++){
 
  $start_time = microtime(true);
  
  //tree_1();
  tree_2();
  
  $end_time = microtime(true);
  $total = ($end_time - $start_time) * 1000;
  echo "<br /> 第 $i 次,用时 $total 毫秒;";
  
 }
//遍历目录文件方法1
 function tree_1(){
  if($file_items = glob('md5/*.*')){
   foreach($file_items as $filename){
    //echo '<li>' . $filename . '</li>';
   }
  }
 }

//遍历目录文件方法2
 function tree_2(){
  if($dir_handle = opendir('md5')){
   while (false !== ($filename = readdir($dir_handle))){
    //echo '<li>' . $filename . '</li>';
   }
   closedir($dir_handle);
  }
 }

第三步:比较两种遍历目录文件方法的运行效率

遍历目录文件方法1运行时间遍历目录文件方法2运行时间
第 1 次,用时 1218.98698807 毫秒;
第 2 次,用时 1184.98492241 毫秒;
第 3 次,用时 959.593057632 毫秒;
第 4 次,用时 1022.73011208 毫秒;
第 5 次,用时 1223.97398949 毫秒;
第 1 次,用时 35.7890129089 毫秒;
第 2 次,用时 36.0209941864 毫秒;
第 3 次,用时 36.8490219116 毫秒;
第 4 次,用时 35.8729362488 毫秒;
第 5 次,用时 36.0000133514 毫秒;
结果:太慢结果:很快