fopen()
Die Funktion fopen() ist eine eingebaute PHP-Funktion zum Öffnen von Dateien oder URLs und gibt einen Dateizeiger zurück.
Was ist die Funktion fopen()?
Die Funktion fopen() ist eine eingebaute PHP-Funktion, die eine Datei (oder eine URL) öffnet und einen Dateizeiger zurückgibt — ein Ressource-Handle, das Sie dann an Funktionen wie fread(), fwrite(), fgets() und fclose() übergeben, um den Stream tatsächlich zu lesen, zu schreiben und zu schließen. Bei einem Fehler gibt sie false zurück und erzeugt eine E_WARNING.
Fast jede Dateiopertion in PHP, die inkrementell liest oder schreibt, beginnt mit fopen(). (Für einmalige Lese- und Schreibvorgänge greift man üblicherweise auf file_get_contents() und file_put_contents() zurück — siehe Wann man fopen() nicht verwenden sollte.)
Syntax
fopen(string $filename, string $mode, bool $use_include_path = false, $context = null): resource|false| Parameter | Beschreibung |
|---|---|
$filename | Pfad zur Datei oder eine URL (z. B. https://…, php://stdin), wenn Wrapper aktiviert sind. |
$mode | Wie die Datei geöffnet werden soll — lesen, schreiben, anhängen usw. Siehe die Tabelle unten. |
$use_include_path | Falls true, durchsucht PHP auch den include_path nach der Datei. |
$context | Ein optionaler Stream-Kontext, der mit stream_context_create() erstellt wird. |
Bei Erfolg gibt die Funktion eine Dateizeiger-Ressource zurück, bei einem Fehler false.
fopen()-Modi
Das Argument $mode ist der Teil, den die meisten falsch machen. Es legt fest, ob die Datei gelesen, geschrieben oder beides geschieht, wo der interne Zeiger beginnt und ob die Datei auf null Bytes geleert wird oder bereits existieren muss.
| Modus | Lesen | Schreiben | Zeiger beginnt bei | Leert? | Falls Datei fehlt |
|---|---|---|---|---|---|
r | ja | nein | Anfang | nein | Warnung, gibt false zurück |
r+ | ja | ja | Anfang | nein | Warnung, gibt false zurück |
w | nein | ja | Anfang | ja | wird erstellt |
w+ | ja | ja | Anfang | ja | wird erstellt |
a | nein | ja | Ende | nein | wird erstellt |
a+ | ja | ja | Ende (Schreibvorgänge immer anhängen) | nein | wird erstellt |
x | nein | ja | Anfang | nein | wird erstellt; schlägt fehl, wenn sie existiert |
x+ | ja | ja | Anfang | nein | wird erstellt; schlägt fehl, wenn sie existiert |
An jeden Modus kann man b (binär, z. B. 'rb') oder t (Text) anhängen. Verwenden Sie immer 'b' für Nicht-Textdateien wie Bilder oder ausführbare Dateien — unter Windows übersetzt der Textmodus stillschweigend Zeilenenden und beschädigt Binärdaten. Unter Unix sind beide identisch, daher ist 'b' überall der sichere Standard.
Grundlegendes Beispiel: Eine Datei lesen
Öffnen Sie eine Datei im Lesemodus, lesen Sie deren Inhalt und schließen Sie sie anschließend. Überprüfen Sie immer den Rückgabewert, bevor Sie das Handle verwenden, und rufen Sie immer fclose() auf, wenn Sie fertig sind, damit das Betriebssystem den Deskriptor freigeben kann.
<?php
$filename = 'myfile.txt';
$file = fopen($filename, 'r');
if ($file === false) {
echo "Unable to open file!";
} else {
echo fread($file, filesize($filename));
fclose($file);
}Wir öffnen myfile.txt im schreibgeschützten Modus und prüfen das Handle mit einem strikten === false-Vergleich — das ist wichtig, weil eine gültige Ressource truthy ist, aber auch einige Nicht-Fehlerwerte, sodass lose Prüfungen später zu Problemen führen können.
In eine Datei schreiben
Das Öffnen mit 'w' erstellt die Datei, falls sie nicht existiert, und leert sie auf null Bytes, wenn sie existiert. Verwenden Sie stattdessen 'a', wenn Sie am Ende hinzufügen möchten, ohne das Vorhandene zu löschen (praktisch für Log-Dateien).
<?php
$file = fopen('log.txt', 'w'); // create / overwrite
fwrite($file, "First line\n");
fwrite($file, "Second line\n");
fclose($file);
$file = fopen('log.txt', 'a'); // append, keep existing content
fwrite($file, "Appended later\n");
fclose($file);
echo file_get_contents('log.txt');Dies gibt alle drei Zeilen aus, da 'a' der Datei hinzugefügt hat, anstatt sie zu ersetzen. Siehe fwrite() für die Schreibseite und feof() für die Erkennung des Dateiendes beim Durchlaufen einer Schleife.
Zeilenweise lesen
Bei großen Dateien sollten Sie nicht alles auf einmal in den Speicher lesen. Kombinieren Sie fopen() mit fgets() und feof(), um eine Zeile nach der anderen zu streamen:
<?php
$file = fopen('myfile.txt', 'r');
if ($file) {
while (!feof($file)) {
$line = fgets($file);
if ($line !== false) {
echo $line;
}
}
fclose($file);
}Häufige Fallstricke
- Vergessen,
falsezu prüfen. Wenn der Pfad falsch ist oder Berechtigungen den Zugriff verweigern, gibtfopen()falsezurück und warnt. Der Aufruf vonfread()auffalsewirft in PHP 8+ einenTypeError. - Das Handle nicht schließen. Offene Deskriptoren sind eine begrenzte Ressource; das Verlieren von ihnen in einem lang laufenden Prozess erschöpft schließlich das OS-Limit. Immer
fclose()aufrufen, idealerweise in einemfinally-Block. - Falscher Modus. Die Verwendung von
'w'statt'r'löscht die Datei stillschweigend. Greifen Sie auf'x'zurück, wenn Sie möchten, dass die Erstellung fehlschlägt, falls die Datei bereits existiert. - Relative Pfade. Sie werden relativ zum aktuellen Arbeitsverzeichnis des Skripts aufgelöst, was nicht immer Ihren Erwartungen entspricht. Bevorzugen Sie absolute Pfade oder
__DIR__ . '/file.txt'.
Wann man fopen() nicht verwenden sollte
Wenn Sie nur die gesamte Datei als string benötigen oder einen string in einem Aufruf in eine Datei schreiben wollen, überspringen Sie den Öffnen/Lesen/Schließen-Ablauf:
| Ziel | Einfachere Funktion |
|---|---|
| Gesamten Dateiinhalt als string einlesen | file_get_contents() |
| Einen string in einem Aufruf in eine Datei schreiben | file_put_contents() |
| Eine Datei als Zeilen-array einlesen | file() |
| Eine Datei direkt zur Ausgabe streamen | readfile() |
Verwenden Sie fopen(), wenn Sie eine detaillierte, inkrementelle Kontrolle benötigen — riesige Dateien in Blöcken lesen, an ein Log anhängen oder mit Nicht-Datei-Streams wie php://stdin arbeiten.
Fazit
fopen() ist die Grundlage der Low-Level-Dateiverarbeitung in PHP: Sie gibt einen Dateizeiger zurück, den Sie mit fread() / fgets() lesen, mit fwrite() beschreiben und immer mit fclose() freigeben. Wählen Sie den richtigen Modus, prüfen Sie den Rückgabewert und schließen Sie das Handle — dann ergeben sich die restlichen Dateiverarbeitungsfunktionen von PHP ganz natürlich.