PHP bietet gleich mehrere Funktionen, um den Inhalt einer Datei zu lesen. Je nach Anwendungsfall eignet sich eine andere Funktion am besten. Dieses Tutorial stellt die wichtigsten Varianten vor und zeigt, wann welche Funktion die richtige Wahl ist.
readfile() für direkte Ausgabe
Die Funktion readfile() liest eine Datei und gibt ihren Inhalt direkt an den Browser aus. Der Inhalt wird dabei nicht in einer Variablen gespeichert, sondern sofort gesendet. Das ist speichereffizient, weil auch große Dateien ohne Probleme verarbeitet werden können.
<?php
readfile('hinweis.txt');
/* Gibt den kompletten Inhalt von hinweis.txt aus */
?>
Der Rückgabewert ist die Anzahl der gelesenen Bytes. Falls die Datei nicht gefunden wird, gibt PHP eine Warnung aus und gibt false zurück.
file_get_contents() für Dateiinhalt als String
Wenn der Inhalt einer Datei in einer Variablen benötigt wird, um ihn weiterzuverarbeiten, ist file_get_contents() die einfachste Lösung. Die Funktion liest die gesamte Datei in einen String.
<?php
$inhalt = file_get_contents('config.txt');
if ($inhalt === false) {
echo 'Datei konnte nicht gelesen werden.';
} else {
echo 'Dateigröße: ' . strlen($inhalt) . ' Bytes';
}
?>
Diese Funktion eignet sich besonders gut, um den Inhalt einer Datei zu durchsuchen, zu verändern oder als Vorlage für Textausgaben zu verwenden.
file() für zeilenweises Einlesen
Die Funktion file() liest eine Datei und gibt jede Zeile als eigenes Element in einem Array zurück. Das ist praktisch, wenn man den Inhalt Zeile für Zeile verarbeiten möchte.
<?php
$zeilen = file('todo.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($zeilen === false) {
echo 'Datei nicht gefunden.';
} else {
foreach ($zeilen as $nr => $zeile) {
echo ($nr + 1) . '. ' . htmlspecialchars($zeile) . '<br>';
}
}
?>
Das Flag FILE_IGNORE_NEW_LINES entfernt die Zeilenumbrüche am Ende jeder Zeile. FILE_SKIP_EMPTY_LINES überspringt leere Zeilen. Beide Flags können mit dem |-Operator kombiniert werden.
Praxisbeispiel: Datei-Download erzwingen
Der häufigste Einsatz von readfile() ist ein Download-Script. Statt eine Datei direkt über die URL erreichbar zu machen, kann PHP den Download steuern und dabei Zugriffsrechte prüfen.
<?php
$datei = 'dokumente/handbuch.pdf';
if (!file_exists($datei)) {
http_response_code(404);
echo 'Datei nicht gefunden.';
exit;
}
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'
. basename($datei) . '"');
header('Content-Length: ' . filesize($datei));
readfile($datei);
exit;
?>
Der Header Content-Disposition: attachment sorgt dafür, dass der Browser die Datei als Download behandelt statt sie anzuzeigen. basename() extrahiert den Dateinamen und verhindert, dass ein Angreifer über den Pfad auf andere Verzeichnisse zugreift.
Praxisbeispiel: Textdatei als Template verwenden
Mit file_get_contents() lässt sich eine Textdatei als Vorlage nutzen. Platzhalter im Text werden durch str_replace() mit den tatsächlichen Werten ersetzt.
<?php
$vorlage = file_get_contents('mail_vorlage.txt');
$mail = str_replace(
['{NAME}', '{DATUM}', '{BESTELLNR}'],
['Max Mustermann', date('d.m.Y'), '2026-00142'],
$vorlage
);
echo $mail;
?>
So lassen sich E-Mail-Texte oder HTML-Fragmente sauber vom PHP-Code trennen. Die Vorlage kann von einem Redakteur bearbeitet werden, ohne den Code anfassen zu müssen.
include und require für PHP-Dateien
Wenn die eingebundene Datei selbst PHP-Code enthält, sollte statt readfile() die Anweisung include oder require verwendet werden. Nur so wird der PHP-Code in der Datei auch tatsächlich ausgeführt.
<?php
/* header.php einbinden */
include 'templates/header.php';
echo '<h1>Willkommen</h1>';
/* footer.php einbinden */
include 'templates/footer.php';
?>
Der Unterschied zwischen include und require: Bei include läuft das Script weiter, wenn die Datei nicht gefunden wird. Bei require bricht das Script mit einem fatalen Fehler ab. Für unverzichtbare Dateien wie Konfigurationen sollte immer require verwendet werden.
Übersicht: Welche Funktion wofür?
readfile() gibt den Inhalt direkt aus, ohne ihn zu speichern. Ideal für Downloads und große Dateien.
file_get_contents() liest den gesamten Inhalt in einen String. Ideal für Konfigurationsdateien, Templates und Textverarbeitung.
file() liest den Inhalt zeilenweise in ein Array. Ideal für Listen, CSV-Dateien und zeilenweise Verarbeitung.
include und require führen PHP-Code in der eingebundenen Datei aus. Ideal für Seiten-Templates und Konfigurationsdateien mit PHP-Syntax.