W3docs

PHP Dateiverarbeitung

PHP bietet vielfältige Möglichkeiten zur Datei- und Ordnerbearbeitung auf dem Server. Dieser Artikel erläutert die Dateiverarbeitungsfähigkeiten von PHP.

Die Dateiverarbeitung gehört zu den häufigsten Aufgaben in der serverseitigen Programmierung: Das Schreiben von Protokollen, das Erstellen von Berichten, das Cachen von Daten, das Importieren von CSV-Dateien und das Bereitstellen von Downloads setzen alle darauf auf. PHP verfügt über eine umfangreiche Sammlung eingebauter Funktionen für die Arbeit mit Dateien, sodass Sie selten eine externe Bibliothek benötigen.

Dieses Kapitel behandelt den vollständigen Lebenszyklus einer Datei — Erstellen, Lesen, Aktualisieren und Löschen (CRUD) — und erklärt, wann welcher Ansatz verwendet werden sollte. Grundsätzlich bietet PHP zwei Stile:

  • Ganzdatei-Hilfsfunktionen (file_get_contents(), file_put_contents()) — eine Zeile, ideal für kleine Dateien, die im Arbeitsspeicher gehalten werden können.
  • Streambasierte Funktionen (fopen(), fread(), fwrite(), fgets(), fclose()) — liefern Ihnen ein Handle, mit dem Sie eine große Datei stückweise lesen oder schreiben können, ohne sie vollständig in den Speicher zu laden.

Zu wissen, welche Variante zu verwenden ist, macht den Unterschied zwischen Code, der bei einer 2 KB großen Konfigurationsdatei funktioniert, und Code, der eine 2 GB große Protokolldatei verarbeiten kann.

Dateimodi

Jeder streambasierte Aufruf beginnt mit fopen($filename, $mode), und der Modus ist der Teil, den Einsteiger am häufigsten falsch machen. Er bestimmt, ob die Datei zum Lesen, Schreiben oder beidem geöffnet wird, ob vorhandene Inhalte gelöscht werden und wo der interne Zeiger startet.

ModusLesenSchreibenZeigerWenn Datei fehltVorhandener Inhalt
"r"janeinAnfangWarnung, gibt false zurückbehalten
"r+"jajaAnfangWarnung, gibt false zurückbehalten
"w"neinjaAnfangerstelltgelöscht (abgeschnitten)
"w+"jajaAnfangerstelltgelöscht (abgeschnitten)
"a"neinjaEndeerstelltbehalten (hängt an)
"a+"jajaEndeerstelltbehalten (hängt an)
"x"neinjaAnfangerstelltschlägt fehl, wenn Datei bereits existiert

Fügen Sie "b" hinzu (z. B. "rb", "wb") für binärsicheren Zugriff bei der Arbeit mit Bildern, PDFs oder beliebigen Nicht-Textdaten — dies verhindert die Zeilenende-Übersetzung unter Windows.

Eine Datei erstellen und schreiben

Um eine Datei zu erstellen, öffnen Sie sie mit fopen() in einem Schreibmodus und schreiben Sie mit fwrite() hinein. Schließen Sie das Handle immer mit fclose(), wenn Sie fertig sind — dies leert den Puffer auf die Festplatte und gibt die Ressource frei.

<?php
$file = fopen("test.txt", "w");   // create/truncate, open for writing
fwrite($file, "Hello World\n");
fwrite($file, "Second line\n");   // each call appends after the previous one
fclose($file);                    // flush to disk and release the handle

Das Öffnen mit "w" löscht alle vorhandenen Inhalte. Um einer Datei etwas hinzuzufügen, ohne den vorhandenen Inhalt zu zerstören, öffnen Sie sie stattdessen im Anfügemodus ("a"):

<?php
$log = fopen("app.log", "a");     // pointer starts at end of file
fwrite($log, "User logged in at " . date("H:i:s") . "\n");
fclose($log);

Für eine schnelle Einzeiler-Lösung, wenn Sie die gesamte Zeichenkette im Speicher haben, überspringen Sie das Handle und verwenden Sie file_put_contents():

<?php
file_put_contents("test.txt", "Hello World\n");          // overwrite
file_put_contents("app.log", "another line\n", FILE_APPEND); // append

Überprüfen Sie immer den Rückgabewert von fopen(). Wenn der Pfad falsch ist oder das Verzeichnis nicht beschreibbar ist, gibt die Funktion false zurück und PHP gibt eine Warnung aus — die Verwendung von false als Handle schlägt danach stillschweigend fehl.

<?php
$file = fopen("/protected/test.txt", "w");
if ($file === false) {
    die("Could not open the file for writing.");
}
fwrite($file, "data");
fclose($file);

Eine Datei lesen

Der einfachste Weg, eine kleine Datei zu lesen, ist file_get_contents(), das den gesamten Inhalt als einzelne Zeichenkette zurückgibt:

<?php
$content = file_get_contents("test.txt");
echo $content;          // prints everything in the file

Bei großen Dateien ist es verschwenderisch, alles in den Speicher zu laden. Lesen Sie die Datei Zeile für Zeile mit fgets() und iterieren Sie, bis feof() (Dateiende) erreicht ist:

<?php
$file = fopen("test.txt", "r");
while (!feof($file)) {
    $line = fgets($file);   // reads one line, including the newline
    echo $line;
}
fclose($file);

Wenn Sie jede Zeile als Array-Element in einem einzigen Aufruf möchten, ist file() praktisch — aber wie file_get_contents() lädt es die gesamte Datei in den Speicher:

<?php
$lines = file("test.txt");          // array, one element per line
echo "This file has " . count($lines) . " lines.";

Eine gute Praxis ist es, vor dem Lesen zu prüfen, ob eine Datei existiert, mit file_exists() (oder is_readable(), um auch Berechtigungen zu prüfen):

<?php
if (file_exists("test.txt")) {
    echo file_get_contents("test.txt");
} else {
    echo "File not found.";
}

Eine Datei aktualisieren

Um den Inhalt einer Datei zu ersetzen, ist file_put_contents() das übersichtlichste Werkzeug. Es öffnet, schreibt und schließt in einem einzigen Aufruf:

<?php
$content = "Hello World Again\n";
file_put_contents("test.txt", $content);   // replaces the old contents

Um einer Datei etwas hinzuzufügen statt sie zu ersetzen, übergeben Sie das FILE_APPEND-Flag (wie oben gezeigt) oder öffnen Sie die Datei im Anfügemodus mit fopen(). Es gibt keine einzelne Funktion zum „Bearbeiten von Zeile 3" — um einen Teil einer Datei zu ändern, liest man sie typischerweise, ändert die Daten in PHP und schreibt sie zurück.

Eine Datei löschen

Verwenden Sie unlink() — beachten Sie den ungewöhnlichen Namen — um eine Datei zu entfernen. Es gibt true bei Erfolg und false bei Misserfolg zurück, also sichern Sie es mit file_exists() ab, um eine Warnung zu vermeiden:

<?php
if (file_exists("test.txt")) {
    if (unlink("test.txt")) {
        echo "File deleted.";
    } else {
        echo "Could not delete the file.";
    }
} else {
    echo "Nothing to delete.";
}

unlink() entfernt nur Dateien. Um ein leeres Verzeichnis zu löschen, verwenden Sie rmdir(); siehe PHP Directory für die Arbeit mit Ordnern.

Wann welcher Ansatz verwendet werden sollte

  • Kleine Text-/Konfigurationsdateien, gesamter Inhalt auf einmalfile_get_contents() / file_put_contents().
  • Große Dateien, zeilenweises Streamingfopen() + fgets() / fread().
  • Anfügen an ein Protokoll → Modus "a" oder FILE_APPEND.
  • Eine Datei nur erstellen, wenn sie noch nicht existiert → Modus "x".
  • Binärdaten (Bilder, PDFs) → das "b"-Flag hinzufügen und fread()/fwrite() verwenden.

Zusammenfassung

Die Dateiverarbeitung ist ein wesentlicher Bestandteil des serverseitigen PHP. Sie haben die beiden Funktionsfamilien kennengelernt — die einzeiligen Ganzdatei-Hilfsfunktionen und die streambasierten Handle-Funktionen — und wann welche geeignet ist, wie Dateimodi das Abschneiden und Anfügen steuern, wie große Dateien effizient mit fgets()/feof() gelesen werden und wie Dateien aktualisiert und sicher gelöscht werden.

Um tiefer einzutauchen, erkunden Sie die entsprechenden Kapitel: Eine Datei erstellen und schreiben, Eine Datei öffnen und lesen, PHP Filesystem-Funktionen, Datei-Upload und PHP Directory.

Übungen

Übung
Was sind die korrekten Möglichkeiten, eine Datei in PHP zu öffnen?
Was sind die korrekten Möglichkeiten, eine Datei in PHP zu öffnen?
Was this page helpful?