After much testing I find that although glob() is much cleaner than opendir(), it is also much slower.
I started by making a dir called "cache" in which I placed a single 65k html file filled with whitespace (just so I could have a large filesize without worrying about char output).
Based on the code below:
<?php
//Waste a little time to offset PHP's startup.
for($i=0; $i<20; $i++) {
print ' ';
}
$start_time = time()+microtime(true);
ob_start();
for($x=0; $x < 20; $x++) {
$dir = 'cache/';
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
//Include the file
include($file);
//$value = rand(0, 10000) * 2345678;
}
closedir($dh);
}
}
}
ob_end_clean();
print ((time()+microtime(true)) - $start_time). ' (opendir time)<br />';
$start_time = time()+microtime(true);
ob_start();
for($x=0; $x < 20; $x++) {
//Include the function files
foreach (glob("cache/*.html") as $file) {
//Include the file
include($file);
//$value = rand(0, 10000) * 2345678;
}
}
ob_end_clean();
print ((time()+microtime(true)) - $start_time). ' (glob time)<br />';
?>The result was:
0.0069890022277832 (opendir time)
0.027945041656494 (glob time)
So I can honestly recommend opendir if you plan on including the files in the dir.
After further testing I found that a simple preg_match() search is also faster than exploding something.
0.0014879703521729 explode
0.0012550354003906 preg
0.054396152496338 glob
<?php
for($i=0; $i<20; $i++) {
print ' ';
}
$start_time = time()+microtime(true);
ob_start();
for($x=0; $x < 10; $x++) {
//glob() is much slower so we use opendir...
foreach(array('cache/', 'cache/') as $dir) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if(end(explode('.', $file)) == 'php') {
//Include the file
require_once($dir. $file);
//Update the array of files included
$site_config["included_files"][$file] = filesize($file);
} else {
print $dir. ' '. $file. '<br />';
}
}
closedir($dh);
} else {
die('<h2>Error!</h2<p>Couldn\'t load '. $dir. '</p>');
}
}
}
ob_end_clean();
print ((time()+microtime(true)) - $start_time). ' explode <br />';
$start_time = time()+microtime(true);
ob_start();
for($x=0; $x < 20; $x++) {
//glob() is much slower so we use opendir...
foreach(array('cache/', 'cache/') as $dir) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if(preg_match("/.php/", $file)) {
//Include the file
require_once($dir. $file);
//Update the array of files included
$site_config["included_files"][$file] = filesize($file);
} else {
print $dir. ' '. $file. '<br />';
}
}
closedir($dh);
} else {
die('<h2>Error!</h2<p>Couldn\'t load '. $dir. '</p>');
}
}
}
ob_end_clean();
print ((time()+microtime(true)) - $start_time). ' preg <br />';
$start_time = time()+microtime(true);
ob_start();
for($x=0; $x < 20; $x++) {
//Include the function files
foreach (glob("cache/*.html") as $file) {
//Include the file
include($file);
//$value = rand(0, 10000) * 2345678;
}
}
ob_end_clean();
print ((time()+microtime(true)) - $start_time). ' glob <br />';
?>Your code snipet is far to be ok regarding glob vs opendir comparison.
That's because opendir is checking for all files in directory cache, when glob is checking only for a) sorted list of files in directory cache with b) extension html.
Its far for being a good comparison.
Sorry, I am sending my third comment, but I just tried this:
<?php
//------------------------ OPENDIR
for($i=0;$i<100;$i++)
{
$x = opendir('d:/internet');
while($a = readdir($x)) {
if ($a == '.' || $a == '..') continue;
if (!is_dir('d:/internet/'.$a)) continue;
$xx = opendir('d:/internet/'.$a);
while ($b = readdir($xx));
}
}
// with closedir() it was 0.2 seconds faster, total 5.7s
//------------------------- GLOB
for($i=0;$i<100;$i++)
{
$x = glob('d:/internet/*');
foreach($x as $a) {
if ($a == '.' || $a == '..') continue;
if (!is_dir('d:/internet/'.$a)) continue;
$xx = glob('d:/internet/'.$a.'/*');
foreach($xx as $b);
}
} // 4.2 seconds
?>