glob()
Die glob()-Funktion ist eine eingebaute PHP-Funktion, die mithilfe eines Musters nach Dateien in einem Verzeichnis sucht und ein Array von Dateinamen oder Verzeichnissen zurückgibt.
Diese Seite behandelt die PHP-Funktion glob(): was sie tut, ihre Syntax und Flags, die shell-ähnlichen Platzhalter, die sie versteht, sowie praktische Muster wie das Abgleichen mehrerer Erweiterungen, das Auflisten nur von Verzeichnissen, das Sortieren von Ergebnissen und das rekursive Durchsuchen eines Verzeichnisbaums. Außerdem werden die Fallstricke erläutert, über die man stolpern kann — versteckte Dateien, der Unterschied zwischen „kein Treffer" und „Fehler" sowie der Fall, in dem ein anderes Werkzeug besser geeignet ist.
Was ist die glob()-Funktion?
Die Funktion glob() durchsucht ein Verzeichnis nach Pfadnamen, die einem Shell-Wildcard-Muster entsprechen, und gibt sie als Array zurück. Der Name stammt vom Unix-Shell-Globbing — demselben Mechanismus, den Ihr Terminal verwendet, wenn Sie ls *.txt eingeben.
Im Gegensatz zu einer regulären Ausdruckssuche gleicht glob() direkt gegen das Dateisystem ab und gibt daher nur Pfade zurück, die tatsächlich existieren. Es ist der schnellste Weg, Fragen zu beantworten wie „Gib mir alle .jpg-Dateien in diesem Ordner" oder „Welche Konfigurationsdateien beginnen mit db-".
Syntax
glob(string $pattern, int $flags = 0): array|false| Parameter | Beschreibung |
|---|---|
$pattern | Das Shell-Wildcard-Muster zum Abgleichen (z. B. images/*.png). Pfade können relativ zum Arbeitsverzeichnis des Skripts oder absolut sein. |
$flags | Optionale Bitmaske aus GLOB_*-Konstanten, die das Verhalten anpassen. Standardmäßig 0. |
Rückgabewert: ein Array mit übereinstimmenden Pfadnamen, ein leeres Array wenn nichts übereinstimmt, oder false bei einem nicht behebbaren Fehler (zum Beispiel ein nicht lesbares Verzeichnis). Da sowohl ein leeres Ergebnis als auch ein Fehler „falsy" sind, prüfen Sie mit === false, wenn Sie Fehler gezielt erkennen müssen.
Die Platzhalter, die glob() versteht
glob() erkennt shell-ähnliche Muster, keine regulären Ausdrücke:
| Muster | Trifft zu auf |
|---|---|
* | beliebig viele Zeichen (aber kein /, bleibt also auf einer Verzeichnisebene) |
? | genau ein Zeichen |
[abc] | ein Zeichen aus der Menge — hier a, b oder c |
[a-z] | ein Zeichen aus einem Bereich |
[!a-z] | ein Zeichen außerhalb des Bereichs |
{a,b} | a oder b — nur wenn das Flag GLOB_BRACE gesetzt ist |
Ein erstes Beispiel
<?php
$files = glob('*.txt');
if ($files === false) {
echo 'glob() failed to read the directory.' . PHP_EOL;
} else {
foreach ($files as $file) {
echo $file . PHP_EOL;
}
}Dies sucht nach allen Dateien mit der Endung .txt im aktuellen Arbeitsverzeichnis und gibt jeden Namen in einer eigenen Zeile aus. Beachten Sie die Prüfung === false: Sie unterscheidet einen echten Fehler vom völlig gültigen Fall „keine .txt-Dateien hier", der einfach ein leeres Array liefert, über das die foreach-Schleife hinweggeht.
Die glob()-Flags
Das zweite Argument kombiniert eine oder mehrere Konstanten mit dem bitweisen ODER-Operator (|):
| Flag | Wirkung |
|---|---|
GLOB_MARK | Hängt ein / an jeden zurückgegebenen Verzeichnisnamen an |
GLOB_NOSORT | Gibt Treffer in der Reihenfolge zurück, die das Dateisystem liefert, und überspringt die standardmäßige alphabetische Sortierung (schneller) |
GLOB_NOCHECK | Falls nichts übereinstimmt, wird das Muster selbst statt eines leeren Arrays zurückgegeben |
GLOB_NOESCAPE | Behandelt Backslashes wörtlich und nicht als Escape-Zeichen |
GLOB_BRACE | Erweitert {a,b,c}, sodass das Muster a, b oder c trifft |
GLOB_ONLYDIR | Gibt nur Einträge zurück, die Verzeichnisse sind |
GLOB_ERR | Bricht ab und gibt false bei Lesefehlern zurück, anstatt sie zu überspringen |
Mehrere Erweiterungen mit GLOB_BRACE abgleichen
<?php
$images = glob('uploads/*.{jpg,jpeg,png,gif}', GLOB_BRACE);
foreach ($images as $image) {
echo $image . PHP_EOL;
}GLOB_BRACE ermöglicht es, mit einem einzigen Aufruf vier Erweiterungen abzudecken — das ist wesentlich übersichtlicher als glob() viermal auszuführen und die Ergebnisse zu zusammenzuführen.
Nur Unterverzeichnisse auflisten
<?php
$dirs = glob('storage/*', GLOB_ONLYDIR);
foreach ($dirs as $dir) {
echo $dir . PHP_EOL;
}Mit GLOB_ONLYDIR werden einfache Dateien innerhalb von storage/ herausgefiltert, sodass nur die Verzeichnisse übrig bleiben — praktisch beim Iterieren über benutzerbezogene Ordner, Cache-Buckets und Ähnliches.
Ergebnisse sortieren
Standardmäßig gibt glob() Treffer in aufsteigender alphabetischer Reihenfolge zurück. Wenn Sie eine andere Reihenfolge benötigen — etwa die neueste Datei zuerst — sortieren Sie das Array selbst:
<?php
$files = glob('logs/*.log');
usort($files, static fn ($a, $b) => filemtime($b) <=> filemtime($a));
print_r($files);Hier ordnet usort() die Liste nach Änderungszeit (filemtime()) neu, neueste zuerst. Übergeben Sie GLOB_NOSORT an glob(), wenn Sie ohnehin neu sortieren werden — das vermeidet die überflüssige initiale Sortierung bei großen Verzeichnissen.
Rekursive Suche
glob() selbst steigt nicht in Unterverzeichnisse hinab — * überschreitet nie ein /. Um einen gesamten Verzeichnisbaum zu durchlaufen, kombinieren Sie glob() mit GLOB_ONLYDIR und Rekursion:
<?php
function findFiles(string $dir, string $pattern): array
{
$files = glob($dir . '/' . $pattern);
foreach (glob($dir . '/*', GLOB_ONLYDIR) as $subDir) {
$files = array_merge($files, findFiles($subDir, $pattern));
}
return $files;
}
print_r(findFiles('src', '*.php'));Für tiefe oder sehr große Verzeichnisbäume ist PHP's RecursiveDirectoryIterator in der Regel besser geeignet, aber dieses Muster reicht für die meisten alltäglichen Aufgaben aus.
Häufige Fallstricke
- Versteckte Dateien werden übersprungen. Ein führendes
*trifft keine Punkt-Dateien, daher gibtglob('*')weder.envnoch.gitignorezurück. Gleichen Sie sie explizit mit einem Muster wieglob('.*')ab. - Leeres Array vs.
false. Eineforeach-Schleife über ein leeres Array ist harmlos, abercount(),array_map()und ähnliche Funktionen geben Warnungen aus, wennglob()falsezurückgegeben hat. Prüfen Sie daher zuerst mit=== false. - Kein Regex.
glob()versteht nur Shell-Platzhalter. Für den Abgleich mit regulären Ausdrücken auf einer vorhandenen Liste von Namen verwenden Siepreg_grep()oder testen Sie einzelne Namen mitfnmatch(). - Plattformübergreifende Pfade. Verwenden Sie Schrägstriche (
/) in Mustern auch unter Windows, oder erstellen Sie Pfade mitDIRECTORY_SEPARATOR, damit derselbe Code überall funktioniert.
Wann glob() vs. andere Werkzeuge verwenden
- Verwenden Sie
glob(), wenn Sie eine schnelle, sortierte Liste von Pfaden benötigen, die einem einfachen Platzhalter in einem Verzeichnis entsprechen. - Verwenden Sie
scandir(), wenn Sie jeden Eintrag eines Verzeichnisses (einschließlich Punkt-Dateien) möchten und selbst filtern. - Verwenden Sie
opendir()/readdir()für speicherschonendes Streaming sehr großer Verzeichnisse. - Verwenden Sie
fnmatch(), um einen einzelnen Namen gegen ein Shell-Muster zu testen, ohne das Dateisystem zu berühren.
Wenn Sie eine Liste von Pfaden haben, helfen Ihnen pathinfo(), is_file() und file_exists() dabei, jeden Eintrag zu untersuchen. Den größeren Zusammenhang finden Sie in der PHP Filesystem-Übersicht.
Fazit
glob() ist der ergonomischste Weg, um in PHP Dateien nach einem Muster zu finden: Übergeben Sie einen shell-ähnlichen Platzhalter und erhalten Sie ein sortiertes Array echter Pfade zurück. Vergessen Sie nicht, bei kritischen Fehlern auf false zu prüfen, greifen Sie auf GLOB_BRACE und GLOB_ONLYDIR zurück, um Muster übersichtlich zu halten, und wechseln Sie zu einem rekursiven Iterator, wenn Sie einen gesamten Verzeichnisbaum durchsuchen müssen.