W3docs

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
ParameterBeschreibung
$filenamePfad zur Datei oder eine URL (z. B. https://…, php://stdin), wenn Wrapper aktiviert sind.
$modeWie die Datei geöffnet werden soll — lesen, schreiben, anhängen usw. Siehe die Tabelle unten.
$use_include_pathFalls true, durchsucht PHP auch den include_path nach der Datei.
$contextEin 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.

ModusLesenSchreibenZeiger beginnt beiLeert?Falls Datei fehlt
rjaneinAnfangneinWarnung, gibt false zurück
r+jajaAnfangneinWarnung, gibt false zurück
wneinjaAnfangjawird erstellt
w+jajaAnfangjawird erstellt
aneinjaEndeneinwird erstellt
a+jajaEnde (Schreibvorgänge immer anhängen)neinwird erstellt
xneinjaAnfangneinwird erstellt; schlägt fehl, wenn sie existiert
x+jajaAnfangneinwird 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, false zu prüfen. Wenn der Pfad falsch ist oder Berechtigungen den Zugriff verweigern, gibt fopen() false zurück und warnt. Der Aufruf von fread() auf false wirft in PHP 8+ einen TypeError.
  • 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 einem finally-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:

ZielEinfachere Funktion
Gesamten Dateiinhalt als string einlesenfile_get_contents()
Einen string in einem Aufruf in eine Datei schreibenfile_put_contents()
Eine Datei als Zeilen-array einlesenfile()
Eine Datei direkt zur Ausgabe streamenreadfile()

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.

Übungen

Übung
Was macht die PHP-Funktion 'fopen' gemäß der genannten URL?
Was macht die PHP-Funktion 'fopen' gemäß der genannten URL?
Was this page helpful?