Einführung in die PHP-Dateierstellung und -Bearbeitung
Lernen Sie, wie Sie in PHP Dateien erstellen und schreiben – mit fopen(), fwrite(), fclose() und file_put_contents() für die Serverprogrammierung.
PHP läuft auf dem Server und kann daher echte Dateien auf der Festplatte lesen und schreiben – generierte Berichte, gecachtes HTML, Protokolleinträge, exportierte CSVs, hochgeladene Nutzerinhalte und Konfigurationsdateien. Dieses Kapitel behandelt den grundlegenden Arbeitsablauf zum Erstellen und Schreiben von Dateien: einen Datei-Handle mit dem richtigen Modus öffnen, Daten schreiben und den Handle schließen. Außerdem wird erklärt, wann die einfacheren einzeiligen Hilfsfunktionen besser geeignet sind.
In PHP gibt es zwei Familien von Werkzeugen zum Schreiben von Dateien:
- Stream-Handles —
fopen()/fwrite()/fclose(). Am besten geeignet, wenn Sie inkrementell schreiben (Protokollzeilen anfügen, große Ausgaben streamen) und eine feine Kontrolle über den Datei-Modus benötigen. - Einmalige Hilfsfunktionen —
file_put_contents(). Am besten geeignet, wenn Sie den gesamten String im Speicher haben und ihn mit einem einzigen Aufruf in eine Datei schreiben möchten.
Wir beginnen mit dem Stream-Ansatz, da das Verstehen der Modi der Schlüssel zu allem anderen ist.
Eine Datei mit fopen() erstellen und schreiben
Um in eine Datei zu schreiben, öffnen Sie sie zunächst mit fopen(). Diese Funktion nimmt den Dateipfad und einen Modus-String entgegen und gibt einen Datei-Handle (eine Ressource) zurück, auf dem die anderen Funktionen operieren:
<?php
$file = fopen("example.txt", "w"); // open for writing, truncating the file
fwrite($file, "This is an example.\n");
fclose($file); // always close the handleWas jede Zeile bewirkt:
fopen("example.txt", "w")öffnetexample.txtim Schreibmodus. Wenn die Datei nicht existiert, wird sie erstellt; wenn sie existiert, wird ihr Inhalt gelöscht (auf null Länge gekürzt).fwrite()schreibt den String in die Datei und gibt die Anzahl der geschriebenen Bytes zurück (oderfalsebei einem Fehler).fclose()leert gepufferte Daten und gibt den Handle frei. Wenn dies ausgelassen wird, können Daten ungeschrieben bleiben, bis das Skript endet.
Ein relativer Pfad wie
"example.txt"wird relativ zum aktuellen Arbeitsverzeichnis des Skripts aufgelöst. Zur Sicherheit und Vorhersehbarkeit sollten Sie einen absoluten Pfad bevorzugen, z. B.__DIR__ . "/example.txt".
Datei-Modi
Der Modus, den Sie an fopen() übergeben, bestimmt, ob die Datei erstellt, abgeschnitten oder angehängt wird und ob Sie sie lesen können. Dies sind die Modi, die für das Erstellen und Schreiben wichtig sind:
| Modus | Bedeutung | Erstellt Datei? | Vorhandener Inhalt | Zeiger beginnt bei |
|---|---|---|---|---|
"w" | Nur schreiben | Ja | Gelöscht | Anfang |
"w+" | Lesen + schreiben | Ja | Gelöscht | Anfang |
"a" | Nur anhängen | Ja | Erhalten | Ende |
"a+" | Lesen + anhängen | Ja | Erhalten | Ende |
"x" | Nur schreiben, schlägt fehl, wenn Datei existiert | Ja (nur wenn neu) | — | Anfang |
"x+" | Lesen + schreiben, schlägt fehl wenn existiert | Ja (nur wenn neu) | — | Anfang |
Verwenden Sie "x", wenn Sie eine vorhandene Datei nicht überschreiben dürfen – zum Beispiel beim Schreiben einer Sperrdatei. Verwenden Sie "a" für Protokolle, bei denen jeder Durchlauf zur Datei hinzufügen und sie nicht überschreiben soll.
Anhängen statt Überschreiben
Ein sehr häufiger Fehler ist die Verwendung von "w" für ein Protokoll und die Frage, warum die Datei immer nur eine Zeile enthält. Öffnen Sie mit "a", um den vorherigen Inhalt zu behalten und am Ende hinzuzufügen:
<?php
$log = fopen("app.log", "a"); // append mode — never erases
fwrite($log, "[" . date("Y-m-d H:i:s") . "] User logged in\n");
fclose($log);Führen Sie dies zweimal aus und die Datei enthält zwei mit Zeitstempel versehene Zeilen statt einer.
Die Abkürzung: file_put_contents()
Wenn Sie den vollständigen Inhalt bereits als String vorliegen haben, erledigt file_put_contents() Öffnen, Schreiben und Schließen in einem einzigen Aufruf:
<?php
// Overwrite (or create) the file with this exact content:
file_put_contents("greeting.txt", "Hello, world!\n");
// Append instead of overwriting:
file_put_contents("app.log", "another line\n", FILE_APPEND);Die Funktion gibt die Anzahl der geschriebenen Bytes zurück oder false bei einem Fehler. Dies ist die übersichtlichste Wahl für kleine, im Speicher vorhandene Daten. Greifen Sie auf fopen()/fwrite() zurück, wenn Sie in einer Schleife schreiben oder den Handle über mehrere Operationen hinweg offen halten müssen.
Das Geschriebene zurücklesen
Um einen Schreibvorgang zu bestätigen, öffnen Sie die Datei im Lesemodus ("r") und lesen Sie sie. Das Begleitkapitel PHP-Datei öffnen/lesen behandelt dies ausführlich, aber die Stream-Version lautet:
<?php
$file = fopen("example.txt", "r");
$contents = fread($file, filesize("example.txt"));
fclose($file);
echo $contents;Hier liest fread() bis zu filesize("example.txt") Bytes – die gesamte Datei – in $contents. Für eine einzeilige Lösung liest file_get_contents() die gesamte Datei in einen String, ohne dass ein Handle verwaltet werden muss.
Fehler und fehlende Dateien behandeln
fopen() gibt false zurück (und gibt eine Warnung aus), wenn die Datei nicht geöffnet werden kann – falsche Berechtigungen, ein nicht vorhandenes Verzeichnis oder ein schreibgeschützter Datenträger. Überprüfen Sie dies immer, bevor Sie schreiben:
<?php
$file = fopen("/no/such/dir/example.txt", "w");
if ($file === false) {
echo "Could not open the file for writing.";
} else {
fwrite($file, "ok");
fclose($file);
}Bevor Sie eine Datei lesen, die Sie im selben Durchlauf nicht erstellt haben, bestätigen Sie mit file_exists() ihr Vorhandensein, um Warnungen von filesize() oder fread() zu vermeiden.
Weitere nützliche Dateifunktionen
Über das Erstellen und Schreiben hinaus bietet PHP ein vollständiges Werkzeugset für die Dateiverwaltung:
file_get_contents()— eine gesamte Datei in einem Aufruf in einen String lesen.file_put_contents()— einen String in einem Aufruf in eine Datei schreiben.file_exists()— prüfen, ob ein Pfad vorhanden ist, bevor darauf zugegriffen wird.unlink()— eine Datei löschen.rename()— eine Datei umbenennen oder verschieben.copy()— eine Datei in einen neuen Pfad kopieren.
Für hochgeladene Dateien aus einem Formular, siehe PHP-Datei-Upload, und für einen umfassenderen Überblick über die Dateisystem-API, siehe PHP-Dateiverarbeitung.
Zusammenfassung
- Öffnen Sie eine Datei mit
fopen($path, $mode); der Modus steuert das Erstellen/Abschneiden/Anhängen. - Verwenden Sie
"w"zum Überschreiben,"a"zum Anhängen und"x", um das Überschreiben einer vorhandenen Datei zu verweigern. fwrite()schreibt undfclose()leert und gibt den Handle frei – immer schließen.- Für das Schreiben vollständiger Strings ist
file_put_contents()die prägnante Ein-Aufruf-Alternative. - Überprüfen Sie den Rückgabewert von
fopen()und verwenden Siefile_exists()für robusten, warnungsfreien Code.