Die Funktion file_get_contents() ist die bevorzugte Methode in PHP, um den gesamten Inhalt einer Datei in einen String zu lesen. Intern nutzt sie Memory Mapping, was sie besonders performant macht. Darüber hinaus kann file_get_contents() auch URLs abrufen und eignet sich damit für einfache HTTP-Anfragen. In diesem Tutorial lernst du die Syntax mit allen Parametern kennen, siehst Beispiele für lokale Dateien und URLs, erfährst, wie du Fehler abfängst, und verstehst die Unterschiede zu cURL und file_put_contents().

Starten wir mit der vollständigen Signatur der Funktion und den Möglichkeiten, die ihre Parameter bieten.
Syntax und Parameter
Die Funktion file_get_contents() akzeptiert bis zu fünf Parameter, von denen nur der erste zwingend erforderlich ist. Der Rückgabewert ist ein String mit dem Dateiinhalt oder false bei einem Fehler.
file_get_contents(
string $filename,
bool $use_include_path = false,
?resource $context = null,
int $offset = 0,
?int $length = null
): string|false
Der Parameter $filename gibt den Pfad zur Datei oder eine URL an. Mit $use_include_path lässt sich die Suche auf den in der php.ini definierten Include-Pfad ausweiten. Der Parameter $context nimmt einen Stream-Kontext entgegen, der beispielsweise HTTP-Header oder POST-Daten enthält. Mit $offset bestimmst du die Startposition, ab der gelesen wird, und $length begrenzt die Anzahl der gelesenen Bytes. So lassen sich auch nur Teile einer Datei einlesen, ohne den gesamten Inhalt in den Speicher laden zu müssen.
Lokale Dateien einlesen
Der häufigste Anwendungsfall ist das Einlesen einer lokalen Datei. Die Funktion liest den gesamten Inhalt und gibt ihn als String zurück. Das funktioniert mit Textdateien, JSON-Dateien, CSV-Dateien und allen anderen Formaten.
<?php
/* Gesamte Datei einlesen */
$inhalt = file_get_contents('config.json');
/* JSON-Daten dekodieren */
$config = json_decode($inhalt, true);
echo $config['datenbank']['host'];
Mit den Parametern $offset und $length lassen sich gezielt Ausschnitte einer Datei lesen. Das ist besonders bei großen Dateien sinnvoll, wenn nur ein bestimmter Bereich benötigt wird.
<?php
/* Ab Byte 100 insgesamt 50 Bytes lesen */
$ausschnitt = file_get_contents('protokoll.log', false, null, 100, 50);
echo $ausschnitt;
URLs einlesen (HTTP-Anfragen)
Wenn in der php.ini die Direktive allow_url_fopen aktiviert ist, kann file_get_contents() auch Inhalte von URLs abrufen. In der Standardkonfiguration führt die Funktion eine einfache GET-Anfrage durch.
<?php
/* JSON-Daten von einer API abrufen */
$json = file_get_contents('https://api.example.com/daten');
if ($json !== false) {
$daten = json_decode($json, true);
echo $daten['name'];
}
Nach dem Aufruf steht die Variable $http_response_header automatisch zur Verfügung. Sie enthält die Antwort-Header des Servers als Array und kann für die Auswertung des HTTP-Statuscodes verwendet werden.
Stream-Kontext für Headers und POST
Für erweiterte HTTP-Anfragen mit eigenen Headern oder POST-Daten wird ein Stream-Kontext benötigt. Dieser wird mit stream_context_create() erzeugt und als dritter Parameter an file_get_contents() übergeben.
<?php
/* POST-Anfrage mit JSON-Daten senden */
$postDaten = json_encode(['name' => 'Max', 'alter' => 30]);
$optionen = [
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json\r\n" .
"Authorization: Bearer abc123\r\n",
'content' => $postDaten,
'timeout' => 10
]
];
$kontext = stream_context_create($optionen);
$antwort = file_get_contents('https://api.example.com/users', false, $kontext);
if ($antwort !== false) {
echo $antwort;
}
Der Stream-Kontext ermöglicht die vollständige Kontrolle über die HTTP-Methode, Header und den Request-Body. Ohne einen solchen Kontext fehlt bei file_get_contents() jegliches Timeout-Handling, was bei langsamen oder nicht erreichbaren Servern zu langen Wartezeiten führen kann.
Fehlerbehandlung
Die Funktion file_get_contents() gibt false zurück, wenn ein Fehler auftritt. Da ein leerer String ein gültiger Rückgabewert ist, muss der Vergleich mit dem strikten Operator === erfolgen. Ein einfaches if (!$inhalt) würde auch bei einem leeren Dateiinhalt greifen und damit ein falsches Ergebnis liefern.
<?php
$inhalt = @file_get_contents('nicht-vorhanden.txt');
if ($inhalt === false) {
echo 'Datei konnte nicht gelesen werden.';
} else {
echo $inhalt;
}
Der @-Operator unterdrückt die PHP-Warnung, die beim Fehlschlag erzeugt wird. In produktivem Code sollte der Fehler stattdessen protokolliert werden. Alternativ lässt sich vorab mit file_exists() und is_readable() prüfen, ob die Datei vorhanden und lesbar ist.
flowchart TD
A[file_get_contents aufrufen] --> B{Datei vorhanden?}
B -->|Ja| C{Lesbar?}
B -->|Nein| D[false zurueck]
C -->|Ja| E[Inhalt als String]
C -->|Nein| D
E --> F{Strikter Vergleich}
F -->|=== false| G[Fehlerbehandlung]
F -->|!== false| H[Inhalt verarbeiten]
D --> F
file_get_contents vs. cURL
Für einfache HTTP-GET-Anfragen ist file_get_contents() die unkompliziertere Wahl. Die Funktion benötigt nur eine Zeile Code und keine zusätzliche Initialisierung. cURL hingegen bietet deutlich mehr Kontrolle: detaillierte Fehlerinformationen, Unterstützung für Cookies, Redirects, Zertifikatsprüfung und parallele Anfragen. Wer komplexe API-Integrationen oder robustes Error-Handling benötigt, sollte auf cURL oder eine HTTP-Client-Bibliothek wie Guzzle zurückgreifen. Für das schnelle Abrufen einer JSON-API oder das Lesen einer lokalen Datei bleibt file_get_contents() die pragmatische Lösung.
file_get_contents vs. file_put_contents
Die Funktionen file_get_contents() und file_put_contents() bilden ein Paar: Die eine liest Dateien, die andere schreibt sie. Beide arbeiten mit dem gesamten Dateiinhalt als String und eignen sich für Dateien, die vollständig geladen oder geschrieben werden können. Während file_get_contents() den Inhalt zurückgibt, schreibt file_put_contents() einen String in eine Datei und gibt die Anzahl der geschriebenen Bytes zurück. Beide Funktionen akzeptieren einen Stream-Kontext und machen die manuelle Verwendung von fopen(), fread(), fwrite() und fclose() in vielen Fällen überflüssig.
<?php
/* Datei lesen */
$daten = file_get_contents('einstellungen.json');
/* Daten veraendern */
$config = json_decode($daten, true);
$config['debug'] = false;
/* Datei schreiben */
file_put_contents('einstellungen.json', json_encode($config, JSON_PRETTY_PRINT));
Hinweise zu php.ini (allow_url_fopen)
Die Direktive allow_url_fopen in der php.ini steuert, ob file_get_contents() auf URLs zugreifen darf. Standardmäßig ist sie aktiviert. Auf Shared-Hosting-Servern kann sie jedoch aus Sicherheitsgründen deaktiviert sein. Der aktuelle Status lässt sich mit ini_get('allow_url_fopen') abfragen. Ist die Direktive deaktiviert, schlägt jeder URL-Zugriff fehl und cURL ist die einzige Alternative. Für lokale Dateien hat diese Einstellung keine Auswirkung. Bei großen Dateien sollte zudem das PHP-Memory-Limit beachtet werden, da file_get_contents() den gesamten Inhalt in den Arbeitsspeicher lädt.
Fazit
Die Funktion file_get_contents() ist die einfachste und performanteste Methode, um Dateiinhalte in PHP als String einzulesen. Dank Memory Mapping arbeitet sie effizient mit lokalen Dateien, und bei aktiviertem allow_url_fopen lassen sich auch HTTP-Anfragen damit absetzen. Für einfache GET-Anfragen und das Lesen kleiner bis mittelgroßer Dateien ist sie die erste Wahl. Bei komplexen HTTP-Szenarien mit Authentifizierung, Redirects oder parallelen Requests empfiehlt sich der Umstieg auf cURL. Die Fehlerbehandlung erfordert stets einen strikten Vergleich mit === false, um leere Dateiinhalte nicht fälschlicherweise als Fehler zu werten. Zusammen mit file_put_contents() bildet sie ein kompaktes Funktionspaar für die alltägliche Arbeit mit Dateien in PHP.