6

假设我们有一个这样的循环:

foreach($entries as $entry){ // let's say this loops 1000 times
   if (file_exists('/some/dir/'.$entry.'.jpg')){
      echo 'file exists';
   }
}

我假设这必须访问 HDD 1000 次并检查每个文件是否存在。

不如这样做呢?

$files = scandir('/some/dir/');
foreach($entries as $entry){ // let's say this loops 1000 times
   if (in_array($entry.'.jpg', $files)){
      echo 'file exists';
   }
}

问题1:如果这访问硬盘一次,那么我相信它应该会快很多。我是对的吗?

但是,如果我必须检查文件的子目录怎么办,如下所示:

foreach($entries as $entry){ // let's say this loops 1000 times
   if (file_exists('/some/dir/'.$entry['id'].'/'.$entry['name'].'.jpg')){
      echo 'file exists';
   }
}

问题2:如果我想应用上述技术(数组中的文件)来检查条目是否存在,我如何将scandir()子目录放入数组中,以便我可以使用这种方法比较文件是否存在?

4

2 回答 2

5

我的观点是,我相信它scandir()会更快,因为它只读取一次目录,file_exists()而且速度很慢。

此外,您可以使用glob(). 这将列出目录中与特定模式匹配的所有文件。看这里

不管我怎么看,你都可以像这样运行一个简单的脚本来测试速度:

<?php

// Get the start time
$time_start = microtime(true);

// Do the glob() method here

// Get the finish time
$time_end = microtime(true);
$time = $time_end - $time_start;

echo '\'glob()\' finished in ' . $time . 'seconds';

// Do the file_exists() method here

// Get the finish time
$time_end = microtime(true);
$time = $time_end - $time_start;

echo '\'file_exists()\' finished in ' . $time . 'seconds';

// Do the scandir() method here

// Get the finish time
$time_end = microtime(true);
$time = $time_end - $time_start;

echo '\'scandir()\' finished in ' . $time . 'seconds';

?>

不确定上述脚本将如何处理缓存,您可能必须将测试分成单独的文件并单独运行

更新 1

您还可以实现该函数memory_get_usage()以返回当前分配给 PHP 脚本的内存量。您可能会发现这很有用。有关更多详细信息,请参见此处

更新 2

至于你的第二个问题,有几种方法可以列出目录中的所有文件,包括子目录。查看这个问题的答案:

扫描目录和子目录中的文件,并使用 php 将它们的路径存储在数组中

于 2013-01-25T08:09:08.743 回答
0

你可以看看这里

我修改了“问题代码”,例如,您可以通过以下方式快速检查,

<?php
   $start = microtime();
    //Your code
    $end = microtime();
    $result= $now-$then;
    echo $result;
?>

我个人认为scandir()会比in_array().

于 2013-01-25T08:09:19.527 回答