Das Lesen von Dateien gehört zu den häufigsten Aufgaben in der PHP-Entwicklung. Ob Konfigurationsdateien, CSV-Exporte oder Logdateien: In vielen Fällen ist es praktisch, den Inhalt einer Datei direkt als Array zu erhalten, wobei jede Zeile einem eigenen Element entspricht. Genau diese Aufgabe übernimmt die PHP-Funktion file(). Sie liest eine komplette Datei ein und gibt deren Inhalt als indiziertes Array zurück. Jeder Eintrag im Array repräsentiert dabei eine einzelne Zeile der Datei. Dieses Tutorial erklärt die Funktionsweise von file() im Detail, zeigt die verfügbaren Parameter und Flags und vergleicht die Funktion mit verwandten Ansätzen wie file_get_contents() und der Kombination aus fopen(), fgets() und fclose().

Schauen wir uns zuerst an, wie die Funktion arbeitet und welche Steuerungsmöglichkeiten die optionalen Parameter bieten.
Was macht die file()-Funktion?
Die Funktion file() liest eine Datei vollständig ein und liefert deren Inhalt als Array zurück. Jede Zeile der Datei wird dabei zu einem eigenen Element des Arrays. Die grundlegende Syntax lautet:
<?php
$zeilen = file("beispiel.txt");
/* Jede Zeile einzeln ausgeben */
foreach ($zeilen as $nummer => $zeile) {
echo "Zeile " . $nummer . ": " . $zeile;
}
Wenn die Datei beispiel.txt drei Zeilen enthält, gibt file() ein Array mit drei Elementen zurück. Der Index beginnt bei 0. Standardmäßig enthält jedes Element am Ende noch den Zeilenumbruch der jeweiligen Zeile. Dieses Verhalten lässt sich über optionale Flags steuern. Bei einem Fehler, etwa wenn die Datei nicht existiert, gibt die Funktion false zurück.
Die Parameter von file()
Die Funktion file() akzeptiert insgesamt drei Parameter. Nur der erste ist zwingend erforderlich, die beiden anderen sind optional und bieten zusätzliche Steuerungsmöglichkeiten.
Dateiname
Der erste Parameter ist der Pfad zur Datei, die eingelesen werden soll. Dieser kann ein relativer oder absoluter Pfad im Dateisystem sein. PHP unterstützt hier auch URLs, sofern die Konfigurationsoption allow_url_fopen aktiviert ist. Der Dateiname wird als String übergeben.
<?php
/* Relativer Pfad */
$zeilen = file("daten/liste.txt");
/* Absoluter Pfad */
$zeilen = file("/var/www/html/daten/liste.txt");
/* URL als Dateiname */
$zeilen = file("https://example.com/daten.txt");
Flags (FILE_IGNORE_NEW_LINES, FILE_SKIP_EMPTY_LINES, FILE_USE_INCLUDE_PATH)
Der zweite Parameter akzeptiert optionale Flags, die das Verhalten der Funktion beeinflussen. Es stehen drei Konstanten zur Verfügung, die sich mit dem Pipe-Operator | kombinieren lassen.
Die Konstante FILE_IGNORE_NEW_LINES entfernt die Zeilenumbrüche am Ende jeder Zeile. Ohne dieses Flag enthält jedes Array-Element am Ende ein \n (unter Linux) oder \r\n (unter Windows). In den meisten Anwendungsfällen ist es sinnvoll, dieses Flag zu setzen, da die Zeilenumbrüche bei der Weiterverarbeitung stören können.
Die Konstante FILE_SKIP_EMPTY_LINES sorgt dafür, dass leere Zeilen übersprungen werden. Zeilen, die nur aus einem Zeilenumbruch bestehen, werden nicht in das Array aufgenommen. Das ist besonders nützlich, wenn Dateien mit inkonsistenter Formatierung verarbeitet werden.
Die Konstante FILE_USE_INCLUDE_PATH weist PHP an, die Datei im Include-Pfad zu suchen. Dieser Pfad wird in der PHP-Konfiguration über die Direktive include_path festgelegt.
<?php
/* Zeilenumbrueche entfernen */
$zeilen = file("config.txt", FILE_IGNORE_NEW_LINES);
/* Leere Zeilen ueberspringen */
$zeilen = file("config.txt", FILE_SKIP_EMPTY_LINES);
/* Beide Flags kombinieren */
$zeilen = file("config.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
/* Alle drei Flags kombinieren */
$zeilen = file(
"config.txt",
FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES | FILE_USE_INCLUDE_PATH
);
Stream-Kontext
Der dritte Parameter ist ein Stream-Kontext, der mit stream_context_create() erstellt wird. Er erlaubt es, zusätzliche Optionen für den Dateizugriff zu definieren, etwa HTTP-Header bei URLs oder spezielle Socket-Einstellungen. In den meisten Fällen wird dieser Parameter nicht benötigt und kann weggelassen werden.
Datei zeilenweise einlesen und verarbeiten
Ein typischer Anwendungsfall ist das Einlesen einer Datei und die anschließende Verarbeitung jeder einzelnen Zeile. Das folgende Beispiel liest eine Textdatei ein, die eine Einkaufsliste enthält, und gibt jede Zeile nummeriert aus.
<?php
$datei = "einkaufsliste.txt";
$zeilen = file($datei, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($zeilen === false) {
echo "Fehler: Die Datei konnte nicht gelesen werden.";
} else {
echo "Einkaufsliste (" . count($zeilen) . " Eintraege):" . PHP_EOL;
foreach ($zeilen as $index => $artikel) {
$nummer = $index + 1;
$artikel = trim($artikel);
echo $nummer . ". " . $artikel . PHP_EOL;
}
}
Durch die Kombination der Flags FILE_IGNORE_NEW_LINES und FILE_SKIP_EMPTY_LINES erhält das Array nur die tatsächlichen Einträge ohne Zeilenumbrüche und ohne leere Zeilen. Die Funktion trim() entfernt zusätzlich eventuelle Leerzeichen am Anfang und Ende jeder Zeile.
Das folgende Diagramm veranschaulicht, wie file() eine Textdatei in ein Array umwandelt.
flowchart LR
A["Textdatei\n(beispiel.txt)"] -->|"file()"| B["PHP Array"]
B --> C["Index 0: Erste Zeile"]
B --> D["Index 1: Zweite Zeile"]
B --> E["Index 2: Dritte Zeile"]
B --> F["Index n: Letzte Zeile"]
Dateien von URLs lesen
Die Funktion file() kann nicht nur lokale Dateien, sondern auch Inhalte von URLs einlesen. Voraussetzung dafür ist, dass die PHP-Konfigurationsoption allow_url_fopen auf On gesetzt ist. Diese Einstellung ist in den meisten PHP-Installationen standardmäßig aktiviert.
<?php
$url = "https://example.com/daten.csv";
/* Stream-Kontext mit Timeout erstellen */
$optionen = array(
"http" => array(
"timeout" => 10,
"method" => "GET",
"header" => "Accept: text/plain\r\n"
)
);
$kontext = stream_context_create($optionen);
$zeilen = file($url, FILE_IGNORE_NEW_LINES, $kontext);
if ($zeilen !== false) {
echo "Empfangene Zeilen: " . count($zeilen) . PHP_EOL;
foreach ($zeilen as $zeile) {
echo $zeile . PHP_EOL;
}
} else {
echo "Die URL konnte nicht gelesen werden.";
}
Beim Lesen von URLs ist der dritte Parameter besonders nützlich. Über den Stream-Kontext lassen sich HTTP-Header, Timeouts und die Anfragemethode definieren. Dadurch wird der Zugriff auf externe Ressourcen flexibel konfigurierbar.
Fehlerbehandlung beim Dateilesen
Eine robuste Fehlerbehandlung ist beim Arbeiten mit dem Dateisystem unentbehrlich. Es gibt verschiedene Gründe, warum das Einlesen einer Datei fehlschlagen kann. Die beiden häufigsten Ursachen sind eine nicht vorhandene Datei und fehlende Berechtigungen.
Datei existiert nicht
Bevor file() aufgerufen wird, sollte mit file_exists() geprüft werden, ob die Datei überhaupt vorhanden ist. Alternativ lässt sich der Rückgabewert von file() direkt auf false prüfen. Zusätzlich kann der Fehlerunterdrückungsoperator @ eingesetzt werden, um Warnmeldungen zu unterdrücken.
<?php
$datei = "konfiguration.txt";
if (!file_exists($datei)) {
echo "Fehler: Die Datei '" . $datei . "' wurde nicht gefunden.";
} else {
$zeilen = @file($datei, FILE_IGNORE_NEW_LINES);
if ($zeilen === false) {
echo "Fehler: Die Datei konnte nicht gelesen werden.";
} else {
echo "Datei erfolgreich eingelesen: " . count($zeilen) . " Zeilen.";
}
}
Berechtigungsprobleme
Auf Linux-Systemen muss der Webserver-Benutzer (häufig www-data) Leserechte für die Datei besitzen. Mit der Funktion is_readable() lässt sich vorab prüfen, ob die Datei tatsächlich gelesen werden darf. Diese Prüfung ist besonders wichtig in Produktivumgebungen, in denen Dateiberechtigungen restriktiv konfiguriert sind.
<?php
$datei = "/var/log/anwendung.log";
if (!file_exists($datei)) {
echo "Die Datei existiert nicht.";
} elseif (!is_readable($datei)) {
echo "Keine Leseberechtigung fuer die Datei.";
} else {
$zeilen = file($datei, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($zeilen !== false) {
echo "Logdatei: " . count($zeilen) . " Eintraege gefunden." . PHP_EOL;
/* Die letzten 5 Eintraege ausgeben */
$letzte = array_slice($zeilen, -5);
foreach ($letzte as $eintrag) {
echo $eintrag . PHP_EOL;
}
}
}
file() vs. file_get_contents()
Beide Funktionen lesen eine Datei vollständig ein, unterscheiden sich aber im Rückgabetyp. Die Funktion file() liefert ein Array, in dem jede Zeile ein eigenes Element darstellt. Die Funktion file_get_contents() hingegen gibt den gesamten Dateiinhalt als einen einzigen String zurück.
Wenn die zeilenweise Verarbeitung im Vordergrund steht, ist file() die bessere Wahl, da das Array direkt mit foreach durchlaufen werden kann. Wenn dagegen der gesamte Inhalt als zusammenhängender Text benötigt wird, etwa zum Parsen von JSON oder XML, bietet sich file_get_contents() an.
Ein weiterer Unterschied betrifft den Speicherverbrauch. Beide Funktionen laden die gesamte Datei in den Arbeitsspeicher. Bei file() kommt jedoch der zusätzliche Overhead des Arrays hinzu, da PHP für jedes Element Verwaltungsdaten anlegt. Für sehr große Dateien mit vielen Zeilen kann file_get_contents() in Kombination mit explode() etwas effizienter sein. In der Praxis ist der Unterschied bei normalen Dateigrößen jedoch vernachlässigbar.
file() vs. fopen/fgets/fclose
Die Kombination aus fopen(), fgets() und fclose() bietet eine alternative Methode zum zeilenweisen Einlesen einer Datei. Der entscheidende Vorteil dieser Methode liegt im Speicherverbrauch. Während file() die gesamte Datei auf einmal in den Arbeitsspeicher lädt, liest fgets() jeweils nur eine einzelne Zeile. Bei sehr großen Dateien, etwa mehrstufigen Logdateien mit mehreren Gigabyte, kann dieser Unterschied erheblich sein.
Die Funktion file() ist die kompaktere Lösung, da sie in einem einzigen Aufruf das gewünschte Ergebnis liefert. Die Variante mit fopen() erfordert dagegen mehr Code: Die Datei muss geöffnet, in einer Schleife zeilenweise gelesen und anschließend wieder geschlossen werden. Dafür bietet sie aber die Möglichkeit, die Verarbeitung jederzeit abzubrechen oder Zeilen selektiv zu überspringen, ohne die gesamte Datei einlesen zu müssen.
Für kleine bis mittelgroße Dateien (bis einige Megabyte) ist file() in der Regel die beste Wahl. Bei Dateien, die den verfügbaren Arbeitsspeicher übersteigen könnten, sollte stattdessen fopen() mit fgets() verwendet werden.
Überblick: PHP File Handling Funktionen
PHP stellt eine Vielzahl von Funktionen für den Umgang mit dem Dateisystem bereit. Die folgende Tabelle gibt einen Überblick über die wichtigsten Funktionen im Zusammenhang mit dem Lesen von Dateien.
| Funktion | Rückgabe | Beschreibung |
file() | Array | Liest eine Datei zeilenweise in ein Array ein |
file_get_contents() | String | Liest den gesamten Inhalt einer Datei als String |
file_put_contents() | int oder false | Schreibt einen String in eine Datei |
fopen() | Resource | Öffnet eine Datei oder URL als Stream |
fgets() | String | Liest eine einzelne Zeile aus einem geöffneten Stream |
fclose() | bool | Schließt einen geöffneten Datei-Stream |
file_exists() | bool | Prüft, ob eine Datei oder ein Verzeichnis existiert |
is_readable() | bool | Prüft, ob eine Datei lesbar ist |
readfile() | int oder false | Liest eine Datei und gibt sie direkt aus |
Fazit
Die PHP-Funktion file() ist ein leistungsfähiges Werkzeug zum zeilenweisen Einlesen von Dateien. Sie liefert den Dateiinhalt als Array, das sich direkt mit foreach oder anderen Array-Funktionen weiterverarbeiten lässt. Durch die Flags FILE_IGNORE_NEW_LINES und FILE_SKIP_EMPTY_LINES kann das Ergebnis bereits beim Einlesen bereinigt werden. Für kleine bis mittelgroße Dateien ist file() die kompakteste und bequemste Lösung. Bei sehr großen Dateien empfiehlt sich dagegen die Kombination aus fopen() und fgets(), um den Speicherverbrauch gering zu halten. Eine sorgfältige Fehlerbehandlung mit file_exists() und is_readable() stellt sicher, dass das Programm auch bei fehlenden oder geschützten Dateien zuverlässig reagiert.