dir()、readdir()、scandir()和glob()四种遍历目录方法及性能分析

 更新时间:2022年12月13日 15:54:28   投稿:yin  
php遍历目录和文件的场景在很多时候都能用到,遍历目录方法的方法有好几种,那么应该使用哪种方法呢?下面介绍dir()、readdir()、scandir()和glob()四种遍历目录方法及性能分析。

       php遍历目录和文件的场景在很多时候都能用到,遍历目录方法的方法有好几种,那么应该使用哪种方法呢?一般情况下,遍历目录时只需遍历出目录和文件,如果要遍历子目录下目录和文件,就需要用到is_dir()判断是否问目录,若是目录则递归遍历。php中遍历目录用到的函数有dir()、readdir()、scandir()和glob(),那么四个函数有什么区别呢?性能又如何呢?

一、使用dir()函数遍历目录

    dir()函数是以对象的方式访问目录,如果成功,返回一个 Directory 类实例,参数错误的情况下返回 NULL , 其它错误情况返回 false。
    代码

function mydir($path){
    $dir = dir($path);
    while(false !== ($file = $dir -> read())){
        if($file != '.' && $file != '..'){
            if(is_dir($path . $file)){
                echo '目录:' . $path . $file . '<br/>'; 
                mydir($path . $file . '/');
                }else{
                echo '文件:' . $path . $file . '<br/>';
                }
            }
        }
    $dir -> close();
    }

二、使用opendir()、readdir()函数遍历目录

    相关函数
        函数opendir()用于打开指定目录,接受一个目录的路径及目录名作为参数,函数返回值为可供其他目录函数使用的目录句柄(资源类型)。如果该目录不存在或者没有访问权限,则返回FALSE。
        函数readdir()用于读取指定目录,接受已经用opendir()函数打开的可操作目录句柄作为参数,函数返回当前目录指针位置的一个文件名,并将目录指针向后移动一位。当指针位于目录的结尾时,因为没有文件存在则返回FALSE。
        函数closedir()关闭指定目录,接受已经用opendir()函数打开的可操作目录句柄作为参数。函数无返回值,运行后关闭打开的目录。
        函数rewinddir()倒回目录句柄,接受已经用opendir()函数打开的可操作目录句柄作为参数。将目录指针重置目录到开始处,即倒回目录的开头。

function myreaddir($path){
    $handle = opendir($path);
    if($handle){
        while (false !== ($file = readdir($handle))) {
            if($file != '.' && $file != '..'){
                if(is_dir($path.$file)){
                    echo '目录:' . $path . $file . '<br/>'; 
                    myreaddir($path . $file . '/');
                }else{
                    echo '文件:' . $path . $file . '<br/>';
                }
            }
        }
    closedir($handle);
    return false;
    }
}

三、使用glob()函数遍历目录

    glob() 函数返回匹配指定模式的文件名或目录,该函数返回一个包含有匹配文件 / 目录的数组,如果出错返回 false。
    代码

function myglob($path){
    foreach(glob($path) as $file){
        if($file != '.' && $file != '..'){
            if(is_dir($file)){
                echo '目录:' . $file . '/';
                myglob($file . '/*');
            }else{
                echo '文件:' . $file . '';
            }
        }
    }
} 

其中参数$path 有三种情况:

    参数$path=’*.*’,表示扫描当前目录下的文件,不包括文件夹,返回的是一个数组。
    参数$path=’images/*’,表示扫描指定目录下所有的文件,包括文件夹,也可以扫描指定的文件类型,如:images/*.jpg;注意,如果只输入:images只会返回该文件夹名称,如果只输入:images/ 则什么也不会返回。

    参数$path=’*’,表示扫描指定目录下的所有文件、目录及子目录的文件。

四、使用php scandir函数遍历目录和所有文件

<?php
$dir = "."; //当前目录
list_file($dir);
function list_file($dir){
    $list = scandir($dir); // 得到该文件下的所有文件和文件夹
    foreach($list as $file){//遍历
        $file_location=$dir."/".$file;//生成路径
        if(is_dir($file_location) && $file!="." &&$file!=".."){ //判断是不是文件夹
            echo "------------------------sign in $file_location------------------";
            list_file($file_location); //继续遍历
        }
        echo "<br/>";
    }
}
?>

五、测试以上四种方法的性能并分析结果

<?php
set_time_limit(0);
for($i = 1; $i <= 5; $i++){
    $starttime = microtime(true);
    mydir('./');
    //scandir('./');
    //myreaddir('./');
    //myglob('*');
    $endtime = microtime(true);
    $total = ($endtime - $starttime) * 1000;
    echo "第 $i 次,用时 $total 毫秒;";
}
?>

       通过测试可以看出,在单一遍历时dir()、readdir()函数效率完败glob()函数;而递归遍历时,glob()函数性能稍微好一点,但优势不是很高。

       dir()函数 Directory 类的实例,而 Directory 类中封装的read()方法与readdir()函数功能一样,所以使用dir()和readdir函数遍历目录时,性能差别不大。

       到此这篇关于dir()、readdir()、scandir()和glob()四种遍历目录方法及性能分析的文章就介绍到这了,更多相关dir()、readdir()、scandir()和glob()区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • php 表单提交大量数据发生丢失的解决方法

    php 表单提交大量数据发生丢失的解决方法

    这篇文章主要介绍了php表单提交大量数据、上千个文本框时发生数据丢失、数据不完整等问题的解决方法,需要的朋友可以参考下
    2014-03-03
  • PHP 网络开发详解之远程文件包含漏洞

    PHP 网络开发详解之远程文件包含漏洞

    由于PHP支持使用相同的函数(Function)对本地文件和远程文件进行操作。因此,一些恶意用户通过强行使网站上的PHP代码(Code)包含自己的文件来实现执行自己脚本的目的。
    2010-04-04
  • php中随机函数mt_rand()与rand()性能对比分析

    php中随机函数mt_rand()与rand()性能对比分析

    这篇文章主要介绍了php中随机函数mt_rand()与rand()性能对比分析,较为详细的分析了两个函数的具体用法,并以实例形式分析了在不同平台下的运行效率问题,需要的朋友可以参考下
    2014-12-12
  • PHP的autoload机制的实现解析

    PHP的autoload机制的实现解析

    在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利
    2012-09-09
  • PHP自定义函数获取搜索引擎来源关键字的方法

    PHP自定义函数获取搜索引擎来源关键字的方法

    这篇文章主要介绍了PHP自定义函数获取搜索引擎来源关键字的方法,涉及php针对来路页面URL的分析与判断技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • PHP及Zend Engine的线程安全模型分析

    PHP及Zend Engine的线程安全模型分析

    在阅读PHP源码和学习PHP扩展开发的过程中,我接触到大量含有“TSRM”字眼的宏。通过查阅资料,知道这些宏与Zend的线程安全机制有关,而绝大多数资料中都建议按照既定规则使用这些宏就可以,而没有说明这些宏的具体作用
    2011-11-11
  • php5对象复制、clone、浅复制与深复制实例详解

    php5对象复制、clone、浅复制与深复制实例详解

    这篇文章主要介绍了php5对象复制、clone、浅复制与深复制,结合实例形式详细分析了php5对象复制、clone、浅复制与深复制相关概念、原理、使用技巧与操作注意事项,需要的朋友可以参考下
    2019-08-08
  • php微信开发接入

    php微信开发接入

    这篇文章主要为大家详细介绍了php微信开发接入,通过检验signature对请求进行校验,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • php&mysql 日期操作小记

    php&mysql 日期操作小记

    在php的很多成熟框架中,数据库存储时间都是用int类型而不是datetime类型的
    2012-02-02
  • PHP设计模式之代理模式的深入解析

    PHP设计模式之代理模式的深入解析

    本篇文章是对PHP设计模式中的代理模式进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论