W3docs

fread()

Die Funktion fread() liest eine bestimmte Anzahl von Bytes aus einer Datei und wird in PHP zum Lesen von Dateiinhalten verwendet.

Die Funktion fread() liest eine gewählte Anzahl von Bytes aus einer geöffneten Datei. Im Gegensatz zu Hilfsfunktionen, die eine ganze Datei in einem einzigen Aufruf einlesen, gibt Ihnen fread() genaue Kontrolle darüber, wie viel Sie auf einmal lesen — genau das, was Sie für große Dateien, Binärdaten oder gestreamte Inhalte benötigen. Diese Seite behandelt die Syntax, den Rückgabewert, das sichere Lesen einer Datei in Blöcken sowie häufige Fallstricke.

Syntax

fread(resource $stream, int $length): string|false
ParameterBeschreibung
$streamEin von fopen() zurückgegebener Dateizeiger (Resource).
$lengthDie maximale Anzahl der zu lesenden Bytes.

fread() stoppt, sobald eines der folgenden Ereignisse eintritt: $length Bytes wurden gelesen, das Dateiende (EOF) wurde erreicht, ein Paket ist verfügbar (bei Netzwerk-Streams) oder es wurden 8192 Bytes gelesen, nachdem der Stream-Puffer gefüllt wurde (bei nicht regulären Dateien). Die Funktion gibt die gelesenen Bytes als string zurück oder false bei einem Fehler.

fread() ist binary-safe — es liest Bytes genau so, wie sie sind, und funktioniert daher für Bilder, PDFs und andere Nicht-Text-Dateien, nicht nur für reinen Text.

Eine ganze Datei lesen

Die einfachste Verwendung besteht darin, eine ganze Datei in einem Aufruf einzulesen, indem ihre Größe als $length übergeben wird:

<?php

$filename = 'myfile.txt';
$file = fopen($filename, 'r');

if ($file) {
    $data = fread($file, filesize($filename));
    echo $data;
    fclose($file);
}

Hier öffnet fopen() die Datei im Nur-Lese-Modus ('r'), filesize() gibt an, wie viele Bytes die Datei enthält, und fread() liest genau diese Anzahl. Kombinieren Sie fopen() immer mit fclose(), damit das Datei-Handle freigegeben wird.

Wenn Sie eine ganze Datei einlesen möchten, ohne ein Handle zu benötigen, ist file_get_contents() eine einzeilige Alternative. Greifen Sie auf fread() zurück, wenn Sie die Lesegröße steuern oder die Datei schrittweise verarbeiten möchten.

Eine Datei in Blöcken lesen

Bei großen Dateien sollten Sie nicht alles auf einmal in den Speicher laden. Lesen Sie pro Iteration einen Block fester Größe und halten Sie am Dateiende mit feof() an:

<?php

$file = fopen('large.log', 'r');

if ($file) {
    while (!feof($file)) {
        $chunk = fread($file, 1024); // read up to 1 KB at a time
        echo $chunk;
    }
    fclose($file);
}

Dadurch bleibt die Speichernutzung unabhängig von der Dateigröße konstant, da sich immer nur ein 1-KB-Block im Speicher befindet. Erhöhen Sie die Blockgröße (z. B. auf 8192), um mehr Speicher gegen weniger Lesezugriffe einzutauschen.

Rückgabewert und Fehlerbehandlung

fread() gibt einen string mit den gelesenen Bytes zurück. Am Dateiende gibt es einen leeren string "" zurück, bei einem Fehler false. Da "" und false beide falsy sind, verwenden Sie eine strikte Prüfung, wenn Sie beide unterscheiden müssen:

<?php

$file = fopen('data.bin', 'rb');

if ($file === false) {
    exit('Could not open the file.');
}

$bytes = fread($file, 16);

if ($bytes === false) {
    echo 'Read failed.';
} else {
    echo 'Read ' . strlen($bytes) . " bytes.\n";
}

fclose($file);

Beachten Sie den Modus 'rb': Unter Windows verhindert das Öffnen im Binärmodus (b) die Übersetzung von Zeilenenden, die Binärdaten beschädigen würde. Auf anderen Plattformen ist es harmlos, daher ist es eine gute Praxis für alle Nicht-Text-Dateien.

Häufige Fallstricke

  • $length ist ein Maximum, keine Garantie. Ein einzelnes fread() kann weniger Bytes zurückgeben als angefordert (z. B. kurz vor EOF oder bei einem Netzwerk-Stream). Um eine genaue Menge zu lesen, verwenden Sie eine Schleife, bis Sie genug gesammelt haben oder EOF erreicht ist.
  • Die Datei muss in einem lesbaren Modus geöffnet sein. Modi wie 'w' öffnen nur zum Schreiben; verwenden Sie 'r', 'r+', 'a+' usw. Die vollständige Modusliste finden Sie unter fopen().
  • Vergessen Sie fclose() nicht. Undichte Handles können die verfügbaren Dateideskriptoren in lang laufenden Skripten erschöpfen.
  • Zeilen lesen? Wenn Sie jeweils eine Zeile statt einer Byteanzahl lesen möchten, ist fgets() das bessere Werkzeug.

Verwandte Funktionen

  • fopen() — öffnet eine Datei und liefert den Zeiger, den fread() benötigt.
  • fwrite() — das Gegenstück, das Bytes in eine Datei schreibt.
  • fgets() — liest eine einzelne Zeile statt einer Byteanzahl.
  • feof() — prüft auf Dateiende beim Schleifen.
  • file-get-contents() — liest eine ganze Datei in einem Aufruf.
  • fclose() — schließt das Datei-Handle, wenn Sie fertig sind.

Fazit

fread() ist PHPs Werkzeug zum Lesen einer genauen Anzahl von Bytes aus einer geöffneten Datei. Verwenden Sie es mit filesize(), um eine ganze Datei einzulesen, oder schleifen Sie es mit feof(), um große Dateien in speicherfreundlichen Blöcken zu streamen. Denken Sie daran, dass $length eine Obergrenze ist, öffnen Sie Binärdateien mit dem Flag b und schließen Sie das Handle immer mit fclose().

Übungen

Übung
Was ist der Zweck der Funktion 'fread' in PHP, wie in der angegebenen URL erläutert?
Was ist der Zweck der Funktion 'fread' in PHP, wie in der angegebenen URL erläutert?
Was this page helpful?