Menu

PHP file_get_contents(): eine Datei in einen String lesen

file_get_contents('notes.txt') liest eine ganze Datei und liefert sie als einen String, oder false, wenn das nicht geht. Ihr Gegenstück file_put_contents() schreibt einen String in eine Datei, und file() liefert die Zeilen als Array.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

file_get_contents('notes.txt') liest die ganze Datei und liefert sie als einen String. Lässt sich die Datei nicht lesen, liefert es false. Zum Schreiben verwendest du file_put_contents('notes.txt', $text), das die Datei anlegt oder ersetzt, was darin stand.

Ausgabe:

Buy milk
Call Ada
Write docs
29 bytes
3 lines

Der Block schreibt zuerst notes.txt und liest es dann zurück, damit es eine Datei zum Arbeiten gibt. Ein Pfad wie 'notes.txt' ist relativ zum aktuellen Arbeitsverzeichnis; in einer Webanwendung baust du den Pfad aus dem eigenen Ordner des Skripts mit __DIR__ . '/notes.txt'.

Mit file_put_contents() schreiben und anhängen

file_put_contents() liefert die Anzahl der geschriebenen Bytes oder false bei einem Fehler. Standardmäßig überschreibt es die Datei. Das Flag FILE_APPEND hängt stattdessen ans Ende an, so funktionieren einfache Logs, und LOCK_EX verhindert, dass zwei Anfragen im selben Moment schreiben:

Ausgabe:

Wrote 8 bytes
started
step 1 done
step 2 done

replaced

abc
5 bytes

Um ein Array zu speichern und als Array zurückzubekommen, schreibst du es mit json_encode() als JSON und liest es mit json_decode().

Eine Datei mit file() Zeile für Zeile lesen

file() liest eine Datei in ein Array mit einer Zeile pro Element. Jede Zeile behält ihren Zeilenumbruch am Ende, außer du übergibst FILE_IGNORE_NEW_LINES, und FILE_SKIP_EMPTY_LINES lässt leere Zeilen weg (es funktioniert nur zusammen mit FILE_IGNORE_NEW_LINES):

Ausgabe:

string(9) "Buy milk
"
1. Buy milk
2. Call Ada
3. Write docs
3 tasks

file() und file_get_contents() laden die ganze Datei in den Speicher. Für Konfigurationsdateien und Logs von ein paar Megabyte ist das in Ordnung. Für eine Datei von Hunderten Megabyte liest du sie stattdessen mit fopen() und fgets() Zeile für Zeile.

Prüfen, ob eine Datei existiert, bevor du sie liest

Fehlt die Datei, liefert file_get_contents() false, und PHP gibt eine Warnung aus:

Warning: file_get_contents(missing.txt): Failed to open stream: No such file or directory in /home/index.php on line 2

Prüfe vorher mit is_file() (eine Datei, die existiert und kein Verzeichnis ist) oder file_exists() (eine Datei oder ein Verzeichnis), und vergleiche das Ergebnis immer mit === false, denn eine leere Datei liefert "", das ebenfalls falsy ist:

Ausgabe:

empty.txt   exists file 
missing.txt missing 
.           exists directory 
Cannot read missing.txt, using defaults
bool(false)
bool(true)
0 bytes

Versteck die Warnung nicht mit @file_get_contents(). Vorher zu prüfen oder false zu behandeln, hält den Fehler sichtbar, wenn etwas anderes schiefgeht.

Einen Teil einer Datei lesen

Das vierte und fünfte Argument sind der Byte-Offset, an dem begonnen wird, und die Anzahl der zu lesenden Bytes. Ein negativer Offset zählt vom Ende der Datei. Mit benannten Argumenten überspringst du die zwei Argumente dazwischen:

Ausgabe:

HEADER
line 2
last line

Offsets zählen Bytes, keine Zeichen. In UTF-8 ist ein japanisches Zeichen 3 Bytes lang, also schneidet ein Offset mitten darin es durch. Um mit Zeichen zu arbeiten, liest du den ganzen String und verwendest mb_substr().

Eine Textdatei auf einer Webseite anzeigen

Dateiinhalt ist Text, und Text, der in HTML ausgegeben wird, muss escapt werden, sonst wird ein < in der Datei zu einem Tag. htmlspecialchars() escapt ihn, und nl2br() macht aus den Zeilenumbrüchen <br>-Tags. Führe es aus und schau dir den Tab Page an:

Entferne htmlspecialchars() und führe es erneut aus: Die Seite endet jetzt bei „v1.2: Fixed“, weil der Browser <title> als echtes Tag liest und alles danach als Seitentitel verschluckt. Die Seite zu htmlspecialchars() erklärt, warum das bei allem zählt, was ein Nutzer schreiben kann.

Eine URL mit file_get_contents() lesen

Mit aktiviertem allow_url_fopen (der Standard in der php.ini) liest file_get_contents() auch URLs und liefert den Body der Antwort. Ein Stream-Kontext fügt eine Methode, Header, einen Body und einen Timeout hinzu:

<?php
$html = file_get_contents('https://example.com/');

$context = stream_context_create([
    'http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/json\r\n",
        'content' => json_encode(['name' => 'Ada']),
        'timeout' => 5,
        'ignore_errors' => true,   // return the body of 4xx/5xx responses too
    ],
]);

$response = file_get_contents('https://api.example.com/users', false, $context);
if ($response === false) {
    // DNS failure, timeout, or a refused connection
}

Für Wiederholungen, Weiterleitungen mit Limits und klare Fehlercodes ist cURL oder eine HTTP-Client-Bibliothek wie Guzzle das bessere Werkzeug.

file_get_contents vs file() vs fopen()

Du willstVerwendeSpeicher
Die ganze Datei als einen Stringfile_get_contents()Die ganze Datei
Die Zeilen als Arrayfile($path, FILE_IGNORE_NEW_LINES)Die ganze Datei
Eine Datei mit einem Aufruf schreiben oder ersetzenfile_put_contents()Die geschriebenen Daten
Eine Zeile an ein Log anhängenfile_put_contents($path, $line, FILE_APPEND | LOCK_EX)Eine Zeile
Eine große Datei zeilenweise lesen oder CSV-Zeilenfopen() mit fgets() oder fgetcsv()Eine Zeile
Dieselbe geöffnete Datei lesen und schreibenfopen() mit r+, a+ oder c+Das Gelesene

Die Funktionen mit einem Aufruf öffnen, lesen oder schreiben und schließen die Datei für dich, also sind sie der richtige Standard. Greif zu fopen(), wenn die Datei zu groß für den Speicher ist oder du sie zwischen Operationen offen halten musst.

Häufig gestellte Fragen

Wie lese ich in PHP eine Datei in einen String?

Rufe file_get_contents('path/to/file.txt') auf. Es liefert die ganze Datei als String oder false, wenn sie sich nicht lesen lässt, also vergleichst du das Ergebnis vor der Verwendung mit === false.

Wie hänge ich in PHP etwas an eine Datei an?

Übergib das Flag FILE_APPEND: file_put_contents('log.txt', "new line\n", FILE_APPEND);. Ohne ersetzt file_put_contents() die ganze Datei. Füge LOCK_EX hinzu (FILE_APPEND | LOCK_EX), wenn mehrere Anfragen gleichzeitig schreiben könnten.

Wie lese ich in PHP eine Datei Zeile für Zeile?

Bei kleinen Dateien liefert file('data.txt', FILE_IGNORE_NEW_LINES) ein Array mit einer Zeile pro Element. Bei großen Dateien öffnest du sie mit fopen() und liest in einer while-Schleife mit fgets() jeweils eine Zeile, sodass nur eine Zeile im Speicher liegt.

Warum liefert file_get_contents false?

Die Datei existiert nicht, der Pfad ist relativ zu einem anderen Verzeichnis, als du denkst, oder PHP hat keine Leseberechtigung. PHP gibt außerdem eine Warnung wie Failed to open stream: No such file or directory aus. Prüfe mit is_file() und is_readable() und baue Pfade aus __DIR__.

Kann file_get_contents eine URL lesen?

Ja, wenn allow_url_fopen in der php.ini aktiviert ist: file_get_contents('https://example.com/') liefert den Body der Antwort. Für Header, POST-Daten oder einen Timeout übergibst du einen Kontext aus stream_context_create(); für alles Aufwendigere bietet cURL bessere Fehlerbehandlung.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S