PHP Filesystem
In diesem Artikel werden die PHP-Filesystem-Funktionen erläutert, die in PHP verfügbar sind und verschiedene Dateioperationen ermöglichen.
Einführung
Die PHP-Filesystem-Funktionen ermöglichen es Ihren Skripten, von der Serverfestplatte zu lesen und darauf zu schreiben: Dateien erstellen, lesen, aktualisieren und löschen sowie Verzeichnisse verwalten. Sie bilden die Grundlage für alles, was Daten außerhalb einer Datenbank speichern muss — Protokolldateien, generierte Berichte, hochgeladene Benutzerdateien, Konfigurationen, Caches und Import/Export-Aufgaben.
Dieser Artikel erläutert die zwei wichtigsten Methoden zum Arbeiten mit Dateien (die handle-basierte Familie rund um fopen() und die einmaligen Hilfsfunktionen wie file_get_contents()), zeigt ausführbare Beispiele für jede davon und weist auf die Berechtigungs- und Fehlerbehandlungsprobleme hin, die in der Produktion häufig auftreten.
Zwei Methoden zum Arbeiten mit Dateien
PHP bietet Ihnen zwei Stile, und die Wahl des richtigen hält Ihren Code einfach:
- Einmalige Hilfsfunktionen —
file_get_contents()undfile_put_contents()lesen oder schreiben eine gesamte Datei in einem einzigen Aufruf. Verwenden Sie diese, wenn die Datei problemlos in den Arbeitsspeicher passt (Konfigurationsdateien, kleine JSON/CSV, Templates). Sie sind die kürzeste und lesbarste Option. - Handle-basierte Funktionen —
fopen(),fread(),fwrite()undfclose()liefern Ihnen ein File-Handle (eine Ressource), das Sie inkrementell lesen oder schreiben. Verwenden Sie diese für große Dateien, die Sie zeilenweise streamen möchten, ohne alles in den Arbeitsspeicher zu laden, oder wenn Sie eine Datei über viele Operationen hinweg geöffnet halten müssen.
Dateioperationen
PHP stellt mehrere Funktionen zum Arbeiten mit Dateien bereit. Diese Funktionen ermöglichen es Ihnen, Dateien zu erstellen, zu öffnen, zu lesen, zu schreiben und zu löschen. Zu den am häufigsten verwendeten Dateifunktionen gehören:
fopen(): Öffnet eine Datei und gibt ein Handle zurück. Es nimmt zwei Argumente entgegen: den Dateinamen und den Modus, in dem sie geöffnet werden soll (siehe Tabelle unten).fclose(): Schließt ein offenes File-Handle und schreibt alle gepufferten Schreibvorgänge auf die Festplatte.fwrite(): Schreibt einen String in eine geöffnete Datei und gibt die Anzahl der geschriebenen Bytes zurück.fread(): Liest eine bestimmte Anzahl von Bytes aus einer geöffneten Datei.feof(): Gibttruezurück, sobald das Ende der Datei erreicht wurde — nützlich als Schleifenbedingung beim Lesen.unlink(): Löscht eine Datei.filesize(): Gibt die Größe einer Datei in Bytes zurück.file_exists(): Prüft, ob eine Datei oder ein Verzeichnis vorhanden ist, bevor Sie darauf zugreifen.
Für einfache Lese-/Schreibaufgaben bevorzugen Sie file_get_contents() und file_put_contents(), die Öffnen, Lesen/Schreiben und Schließen in einem einzigen Aufruf übernehmen.
Datei-Modi für fopen()
Das zweite Argument für fopen() steuert, was Sie mit dem Handle tun können und was mit vorhandenem Inhalt geschieht. Die häufigsten Modi sind:
| Modus | Bedeutung |
|---|---|
"r" | Nur lesen. Zeiger beginnt am Anfang. Schlägt fehl, wenn die Datei nicht existiert. |
"w" | Nur schreiben. Kürzt die Datei auf null Länge (oder erstellt sie). |
"a" | Nur schreiben, anhängen. Erstellt die Datei, wenn sie fehlt; vorhandener Inhalt bleibt erhalten. |
"x" | Nur schreiben, schlägt aber fehl, wenn die Datei bereits existiert — sicherer "neu erstellen"-Modus. |
"r+" | Lesen und schreiben. Zeiger am Anfang; Datei muss vorhanden sein. |
Achtung:
"w"löscht vorhandenen Inhalt in dem Moment, in dem Sie die Datei öffnen. Wenn Sie einem Protokoll hinzufügen möchten, anstatt es zu überschreiben, verwenden Sie"a".
Verzeichnisoperationen
PHP bietet auch Funktionen zum Arbeiten mit Verzeichnissen. Diese Funktionen ermöglichen es Ihnen, Verzeichnisse zu erstellen, zu löschen und zu bearbeiten. Zu den am häufigsten verwendeten Verzeichnisfunktionen gehören:
mkdir(): Diese Funktion wird verwendet, um ein Verzeichnis zu erstellen.rmdir(): Diese Funktion wird verwendet, um ein Verzeichnis zu löschen.opendir(): Diese Funktion wird verwendet, um ein Verzeichnis zu öffnen.readdir(): Diese Funktion wird verwendet, um den Inhalt eines Verzeichnisses zu lesen.closedir(): Diese Funktion wird verwendet, um ein geöffnetes Verzeichnis zu schließen.
Beispiele
Schauen wir uns an, wie diese Funktionen in der Praxis verwendet werden.
Eine Datei erstellen und beschreiben
Um eine Datei zu erstellen und darauf zu schreiben, öffnen Sie sie im Schreibmodus mit fopen(), schreiben Sie mit fwrite() und rufen Sie anschließend immer fclose() auf:
<?php
$file = fopen("example.txt", "w");
if ($file === false) {
exit("Error opening file");
}
fwrite($file, "Hello, world!");
fclose($file);Dadurch wird example.txt im selben Verzeichnis wie das Skript erstellt (und überschrieben, falls bereits vorhanden), Hello, world! geschrieben und das Handle geschlossen.
Dieselbe Aufgabe mit der einmaligen Hilfsfunktion ist eine einzige Zeile — dies ist der bevorzugte Stil für kleine Dateien:
<?php
file_put_contents("example.txt", "Hello, world!");Eine Datei lesen
Um eine Datei mit einem Handle zu lesen, öffnen Sie sie im Lesemodus und verwenden Sie fread(). Die Übergabe von filesize() teilt fread() mit, wie viele Bytes gelesen werden sollen:
<?php
$file = fopen("example.txt", "r");
if ($file === false) {
exit("Error opening file");
}
echo fread($file, filesize("example.txt"));
fclose($file);Für kleine Dateien erledigt file_get_contents() dasselbe in einem Aufruf:
<?php
echo file_get_contents("example.txt");Eine Datei zeilenweise lesen
Für große Dateien lesen Sie zeilenweise mit fgets(), damit Sie nie die gesamte Datei im Arbeitsspeicher halten. Die Schleife läuft, bis feof() das Dateiende meldet:
<?php
$file = fopen("example.txt", "r");
if ($file === false) {
exit("Error opening file");
}
while (!feof($file)) {
$line = fgets($file);
echo $line;
}
fclose($file);An eine Datei anhängen
Um einer Datei etwas hinzuzufügen, ohne den vorhandenen Inhalt zu löschen, öffnen Sie sie im Anhängemodus ("a"). Dies ist der richtige Modus für Protokolle:
<?php
$file = fopen("log.txt", "a");
fwrite($file, "New log entry\n");
fclose($file);Ein Verzeichnis erstellen
Um ein Verzeichnis zu erstellen, verwenden Sie die Funktion mkdir():
<?php
mkdir("example_directory");Dadurch wird ein Verzeichnis namens example_directory neben dem Skript erstellt. Um verschachtelte Verzeichnisse in einem Aufruf zu erstellen, übergeben Sie den Modus und das rekursive Flag:
<?php
mkdir("parent/child/grandchild", 0755, true);Hinweis:
mkdir()erfordert Schreibberechtigung für das übergeordnete Verzeichnis. Das dritte Argument (true) ermöglicht die rekursive Erstellung von Zwischenverzeichnissen.
Eine Datei löschen
Um eine Datei zu löschen, verwenden Sie die Funktion unlink():
<?php
if (file_exists("example.txt")) {
unlink("example.txt");
}Das vorherige Prüfen mit file_exists() verhindert eine Warnung, wenn die Datei bereits nicht mehr vorhanden ist.
Best Practices
- Handles immer schließen. Jedes
fopen()sollte mit einemfclose()gepaart werden, damit gepufferte Schreibvorgänge geleert und die Ressource freigegeben wird. - Rückgabewerte prüfen.
fopen(),mkdir()undunlink()geben bei einem Fehlerfalsezurück — schützen Sie sich davor, anstatt Erfolg anzunehmen. - Berechtigungen beachten. Die meisten "permission denied"-Fehler entstehen dadurch, dass der Webserver-Benutzer das Zielverzeichnis nicht besitzt, nicht durch Ihren Code.
- Das richtige Werkzeug wählen. Greifen Sie für ganzseitige Dateiarbeit auf
file_get_contents()/file_put_contents()zurück; verwenden Sie die Familiefopen()/fread()nur, wenn Sie Streaming benötigen.
Fazit
Die Filesystem-Funktionen bilden die Grundlage für die Datei- und Verzeichnisverwaltung in PHP. Wenn Sie den Unterschied zwischen einmaligen Hilfsfunktionen und handle-basiertem Streaming verstehen, den richtigen fopen()-Modus wählen und Handles sicher bereinigen, können Sie robuste Anwendungen erstellen, die Daten und Konfigurationen zuverlässig speichern. Um tiefer einzutauchen, erkunden Sie PHP File Handling, PHP File Open/Read und Arbeiten mit Verzeichnissen.