glob() vs. DirectoryIterator

Nach dem hier und hier die PHP Funktion glob() als besonders revolutionär bzw. exotisch hervorgehoben wurde, muss ich heute die Euphorie ein wenig dämpfen.  Schon letztes Jahr hatte ich mit den Nachteilen von glob() bei der Umsetzung des Statistik Plugins für die Software easyLink zu kämpfen. Wegen den Problemen habe ich auf das Schweizer Taschenmesser jeder PHP5 Distribution zurückgegriffen: Die Standard PHP Library, kurz: SPL. Die Vorteile der DirectoryIterator Klasse im direkten Vergleich zur glob() Funktion möchte ich hier einmal erleutern.

Die Funktion glob()

Auf den ersten Blick bietet die Funktion glob() eine Menge Vorteile in Hinblick auf die bisher verwendeten Funktionen opendir(), readdir() und closedir(). Mit nur einer Funktion statt der drei eben genannten kann ich den Verzeichnisinhalt ermitteln. Zur Veranschaulichung folgendes Codebeispiel:

$files = array();
foreach (glob('*') as $file) {
    $files[] = $file;
}

In einer einfachen foreach()-Schleife ermittelt man so den kompletten Inhalt eines Verzeichnisses. Soweit sieht das alles auch sehr gut aus. Nur treten im praktischen Einsatz diverse Probleme auf. Die Funktion gibt bei PHP Versionen < 5.3 ein false statt eines, wie in der Dokumentation beschrieben, leeren Arrays zurück. Somit ist es manchmal nicht möglich zwischen einer leeren Ergebnismenge und einem aufgetretenen Fehler zu unterscheiden. Weiterhin ist die Funktion nicht auf allen Systemen verfügbar. Darüber hinaus gibt es Provider, die PHP so konfiguriert haben, dass glob() nicht angewendet werden kann.

Die DirectoryIterator Klasse

Bei allen Nachteilen, die die Funktion glob() auf den zweiten Blick aufwirft, gibt es eine sinnvolle Alternative. Die SPL bringt die DirectoryIterator Klasse mit, die es ermöglicht einen Verzeichnisinhalt zu ermitteln. Anders als die Funktion glob() stellt jeder ermittelte Inhalt (eine Datei oder ein Verzeichnis) ein eigenes Objekt dar, welches gerade den Umgang in OOP sehr viel einfacher bzw. komfortabler macht. Die Handhabung der DirectoryIterator Klasse ist ebenso einfach die der Funktion glob().

$files = array();
foreach (new DirectoryIterator(dirname(__FILE__)) as $file) {
    $files[] = $file->getFilename();
}

In diesem kleinen Beispiel sieht man auch die Vorteile. Jedes DirectoryIterator Objekt hat seine eigenen Methoden, die den Umgang mit dem Verzeichnisinhalt sehr viel einfacher machen.

Der direkte Vergleich

Auch im direkten Vergleich lässt die DirectoryIterator Klasse die glob() Funktion weit hinter sich. Ich habe die beiden oben genanntn Beispiel in einer Schleife jeweils 1.000 mal durchlaufen lassen. Es wurde jeweils ein Verzeichnis mit 10 Inhalten (4 Untererzeichniss und 6 Dateien) durchlaufen. Während meinen Tests hat die Funktion glob durchschnittlich 0,625 Sekunden für die Ermittlung des Verzeichnisinhaltes benötigt. Die DirectoryIterator Klasse hat die gleiche Aufgabe in durchschnittlich 0,172 Sekunden erledigt. Somit ist die DirectoryIterator Klasse gute 400% schneller als die Funktion glob().

Fazit

Die Funktion glob() ist also nicht die Wunderfunktion, an die man nicht vorbei kommt. Natürlich stellt sie zu älteren Herangehensweisen eine deutliche Erleichterung dar. Bei all den Nachteilen, die diese Funktion aber mit sich bringt, ziehe ich persönlich immer die DirectoryIterator Klasse vor. Sie arbeitet sehr viel schneller und bietet entsprechende Methoden, die das Handling von Verzeichnisinhalten sehr vereinfachen. Zudem wirft die DirectoryIterator Klasse eine Exception, wenn das angegebene Verzeichnis nicht ermittelt werden kann. Die Funktion glob() hingegen verhält sich ausgesprochen unvorhersehbar, das sie unter Umständen noch einen Bug aufweist.

2 Gedanken zu „glob() vs. DirectoryIterator“

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.