Liebe Helfer,
seit einiger Zeit ist mir aufgefallen, dass der erste Seitenaufbau innerhalb einer Session sehr lange dauert. 14 Sekunden. Ich ging auf Spurensuche und fand heraus, dass es mit einer Funktion LoadDirectory zu tun hat. Dort lese ich ein Verzeichnis aus, welches ca 1000 (<10kb) Dateien enthält. Die Funktion gibt ein Array zurück. Man kann verschiedene Parameter der Funktion übergeben. Zum Beispiel "Suchmuster", "Nur-Dateien", etc... (Funktion siehe unten).
Mir kam es dann aber doch etwas krass vor, dass 1000 Dateien 14 sek. brauchen sollten (nur Dateinamen zurückgeben, nicht öffnen). Also habe ich mal in die while-Schleife reingeschaut. Endlich habe ich eine Zeile identifiziert, die die lange Zeit verursacht.
// this is very very time consuming:
if(($onlyfiles) and (!is_file($path.$file))) $stat = false;
Mit Auskommentieren dieser Zeile geht es auch beim ersetn Seitenaufbau in weniger als 1 sek.
Übrigens geht es ab dem zweiten Seitenaufbau immer schnell, auch mit dieser Zeile. Ich nehme an, von da an cached php die Ordnerstruktur.
Die Frage: kann es wirklich sein, dass die Funktion is_file() so viel Zeit in Anspruch nimmt? Was kann ich stattdessen für diesen Schalter (nur Dateien zurückgeben) einbauen?
Vielen Dank
Hier kommt die Funktion:
function LoadDirectory($path, $pattern = null, $ausschluss = null, $onlyfiles = true){
// to store processing time
$lap = array();
if(substr($path, -1) != "/") $path.="/";
if(is_dir($path)){
$all_files = array();
if(is_null($ausschluss)) $ausschluss = array();
$ausschluss[] = ".";
$ausschluss[] = "..";
$ausschluss[] = ".htaccess";
$ausschluss[] = ".ftpquota";
$handle = opendir($path);
if(is_null($pattern)) $pattern = array();
if(!is_array($pattern)) $pattern = array($pattern);
$lap["start"] = microtime(true);
while (false !== ($file = readdir($handle))){
$stat = true;
foreach($pattern as $filter) if(!is_integer(strpos($file,$filter))) $stat = false;
if(in_array($file,$ausschluss)) $stat = false;
// this is very very time consuming:
if(($onlyfiles) and (!is_file($path.$file))) $stat = false;
if($stat) $all_files[] = $file;
}
$lap["end"] = microtime(true);
if (count($all_files)!=0) sort($all_files);
foreach($lap as $i=>$time) d(round($time-$lap["start"],2), "LAP ---- load dir ---- $path ---- $i");
return $all_files;
}
return false;
}
// d() is an alias of var_dump()
function d($x, $y=null){
echo "<pre><div style='margin:0px; line-height:12px; width:100%; background-color:#515151; height:12px; color:#ffffff; font-size:10px;'>$y</div><div style='min-height:20px; background-color:#ffffff;'>";
var_dump($x);
echo "</div></pre>";
}
Cheers,
Baba