Php 是否有一种快速有效的方法来扫描目录并根据找到的文件生成标记?

Php 是否有一种快速有效的方法来扫描目录并根据找到的文件生成标记?,php,smarty,markup,Php,Smarty,Markup,我编写了这段代码,它的作用是根据从数据库中提取的信息设置路径变量。然后,它搜索目录并取出我想插入页面的文件 我使用的是Smarty模板引擎,我的问题是,即使它能达到我想要的程度。它的运行速度非常慢,在加载整个页面之前,扫描目录、提取文件并进行标记需要一段时间 // Load variables based on if the user has a custom theme applied or a default one $theme_name = $default->get_theme(

我编写了这段代码,它的作用是根据从数据库中提取的信息设置路径变量。然后,它搜索目录并取出我想插入页面的文件

我使用的是Smarty模板引擎,我的问题是,即使它能达到我想要的程度。它的运行速度非常慢,在加载整个页面之前,扫描目录、提取文件并进行标记需要一段时间

// Load variables based on if the user has a custom theme applied or a default one
$theme_name = $default->get_theme('theme_dir_name', 'dash');
if($users->get_settings('theme_is_custom', $auth->session->get('user_id')) == 1)
{
    $css_path = "/".$auth->session->get("user_name")."/css";
    $theme_dir  = dirname(__FILE__) . "/assets/users/".$users->get_user_id($_GET['user'])."/themes/".$theme_name."/tpl/";
    $s->assign("css_dir", $css_path."/".$theme_name);
    $s->assign("js_dir" , "/".$_GET['user']."/js/".$theme_name);
}else{
    $css_path = "/css";
    $theme_dir  = dirname(__FILE__) . "/assets/default/themes/".$theme_name."/tpl/";
    $s->assign("css_dir", $css_path."/".$theme_name);
    $s->assign("js_dir" , "/js/".$theme_name);
}
// Load modules
foreach($users->get_active_module($auth->session->get('user_id')) as $m)
{
    if(@$m['module_is_custom'] == 1)
    {
        $path = "/".$auth->session->get("user_id")."/modules/".$m['module_folder_name']."/index.php";
        $dir = "/".$auth->session->get("user_id")."/modules/".$m['module_folder_name'];
    }else{
        $path = dirname(__FILE__)."/assets/default/modules/".$m['module_folder_name']."/index.php";
        $dir = dirname(__FILE__)."/assets/default/modules/".$m['module_folder_name'];
        $js = "/modules/default/".$m['module_folder_name']."/js/";
        $css = "/modules/default/".$m['module_folder_name']."/css/";
    }
    $css_module = "";
    $js_module = "";
    $module = $s->fetch($path);
    if($handle = opendir($dir."/css/"))
    {
        while(false !== ($file = readdir($handle)))
        {
            if($file != "." && $file != ".."){
                $css_module .= '<link rel="stylesheet" href="'.$css.$file.'" />';
            }
        }
        closedir($handle);
    }
    if($handle = opendir($dir."/js/"))
    {
        while(false !== ($file = readdir($handle)))
        {
            if($file != "." && $file != "..")
            {
                $js_module .= '<script type="text/javascript" src="'.$js.$file.'"></script>';
            }
        }
        closedir($handle);
    }
    $s->assign($m['module_folder_name']."_module", $css_module."\n".$js_module."\n".$module);
}
编辑:


使用这个函数,我自己编写并在几个项目中使用它

function getFileList($dir) { 
    $retval = array(); 
    if(substr($dir, -1) != "/") $dir .= "/"; 
    $d = @dir($dir) or die("getFileList: Failed opening directory $dir for reading"); 
    while(false !== ($entry = $d->read())) { 
        if($entry[0] == ".") continue; 
        if(is_dir("$dir$entry")) { 
            $retval[] = array( "name" => "$dir$entry/", "type" => filetype("$dir$entry"), "size" => 0, "lastmod" => filemtime("$dir$entry") ); 
        } elseif(is_readable("$dir$entry")) { 
            $retval[] = array( "name" => "$dir$entry", "type" => mime_content_type("$dir$entry"), "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ); 
        } 
    } 
    $d->close(); 
    return $retval; 
}

请注意我在上面发布的功能。。。除此之外,请先加载要在数组中使用的任何数据,然后在收集所有数据后一次性处理标记。

如果您使用的是PHP5.3或更高版本,我建议使用作为一个优雅的解决方案

这种方法的一个优点是,可以通过将迭代器替换为and来实现递归

您还可以使用该类而不是不推荐使用的类

以下是一个替代品:


在PHP 5.2或更高版本上也可以完成大部分操作,不过您需要使用。

hmmm,请稍候,让我看看是否将其拼接到我的应用程序中。我已将其格式化,以便为我工作;-我还加了一行
function getFileList($dir) { 
    $retval = array(); 
    if(substr($dir, -1) != "/") $dir .= "/"; 
    $d = @dir($dir) or die("getFileList: Failed opening directory $dir for reading"); 
    while(false !== ($entry = $d->read())) { 
        if($entry[0] == ".") continue; 
        if(is_dir("$dir$entry")) { 
            $retval[] = array( "name" => "$dir$entry/", "type" => filetype("$dir$entry"), "size" => 0, "lastmod" => filemtime("$dir$entry") ); 
        } elseif(is_readable("$dir$entry")) { 
            $retval[] = array( "name" => "$dir$entry", "type" => mime_content_type("$dir$entry"), "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ); 
        } 
    } 
    $d->close(); 
    return $retval; 
}
function getFileList($dir, $recursive = false)
{
    $finfo = new finfo(FILEINFO_MIME);
    $retval = array();

    if ($recursive)
    {
        // Note: If RecursiveIteratorIterator::SELF_FIRST is removed it will use the default
        //       RecursiveIteratorIterator::LEAVES_ONLY and therefore ignore directories.
        $iter = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), 
                                                    RecursiveIteratorIterator::SELF_FIRST);
    }
    else
    {
        $iter = new FilesystemIterator($dir);
    }

    foreach ($iter as $path => $info)
    {
        $filename = $info->getFilename();

        if ("." === $filename[0])
        {
            // ignore hidden files on unix for compatability with the Oliver's function
            // note that the default constructor flag FilesystemIterator::SKIP_DOTS will have skipped the . and .. files anyway.
            continue;
        }

        $val = array("name" => $path, 
                     "type" => $info->getType(), 
                     "size" => $info->getSize(), 
                     "lastmod" => $info->getMTime());

        if ($info->isFile())
        {
            $fulltype = $finfo->file($path);
            // $finfo->file() returns something like "application/octet-stream; charset=binary"
            // the first part matches what mime_content_type() returns, ignore the rest for compatability with Oliver's function
            $ftypeparts = explode(";", $fulltype, 2);
            $val ["type"] = $ftypeparts[0];
        }

        $retval[] = $val;
    }

    return $retval;
}