fgets()
Die Funktion fgets() liest in PHP eine einzelne Zeile aus einer Datei und gibt sie als string zurück.
Die Funktion fgets() liest jeweils eine Zeile aus einem geöffneten Datei-Handle. Sie ist die Standardmethode, um Textdateien in PHP zu verarbeiten, ohne die gesamte Datei in den Speicher zu laden — was bei großen Dateien wichtig ist, bei denen ein komplettes Einlesen auf einmal (mit file_get_contents() oder fread()) aufwändig oder unmöglich wäre.
Diese Seite behandelt die Syntax, den Rückgabewert von fgets(), die korrekte Leseschleife, häufige Stolperfallen und die Beziehung zu anderen Dateilese-Funktionen.
Was ist die Funktion fgets()?
fgets() liest ab der aktuellen Position eines geöffneten Datei-Handles bis einschließlich des nächsten Zeilenumbruchzeichens (\n) und gibt diesen Text als string zurück. Anschließend rückt der Datei-Zeiger vor, sodass der nächste Aufruf die nächste Zeile liest.
Die Funktion ist nicht auf Dateien auf der Festplatte beschränkt: Jeder mit fopen() geöffnete Stream funktioniert, einschließlich php://stdin zum Lesen von Tastatureingaben und Remote-URLs.
Syntax
fgets(resource $stream, ?int $length = null): string|false$stream— ein vonfopen()(oder einer anderen Stream-Funktion) zurückgegebener Datei-Zeiger. Er muss noch geöffnet sein.$length(optional) — liest höchstens$length - 1Bytes. Das Lesen endet, wenn ein Zeilenumbruch erreicht wird, das Dateiende erreicht wird oder$length - 1Bytes gelesen wurden — je nachdem, was zuerst eintritt. Weglassen, um die gesamte Zeile unabhängig von ihrer Länge zu lesen.
Was fgets() zurückgibt
| Situation | Rückgabewert |
|---|---|
| Eine Zeile wurde gelesen | Die Zeile als string, mit dem abschließenden \n |
| Bereits am Dateiende | false |
| Ein Fehler ist aufgetreten | false |
Da der Zeilenumbruch erhalten bleibt, reproduziert echo die Zeilenumbrüche der Datei. Wenn Sie diese nicht möchten, entfernen Sie sie mit rtrim($line, "\r\n").
Die Tatsache, dass
fgets()am Dateiendefalsezurückgibt, lässt die untenstehende Leseschleife funktionieren — Sie benötigen nicht einmalfeof().
So verwenden Sie fgets(): die drei Schritte
- Öffnen Sie die Datei mit
fopen()in einem Lesemodus wie"r". - Lesen Sie Zeile für Zeile mit
fgets(). - Schließen Sie das Handle mit
fclose(), wenn Sie fertig sind.
Die empfohlene Leseschleife
Das sauberste Muster nutzt den Rückgabewert false als Schleifenbedingung. Eine Zuweisung in PHP ergibt den zugewiesenen Wert, daher liest while (($line = fgets($file)) !== false) eine Zeile und prüft sie in einem Schritt:
<?php
$file = fopen("file.txt", "r");
if ($file === false) {
exit("Could not open the file.\n");
}
while (($line = fgets($file)) !== false) {
echo $line; // newline is already part of $line
}
fclose($file);Der strikte Vergleich !== false ist wichtig: Eine Zeile, die nur "0" enthält, ist in PHP „falsy", daher würde ein einfaches while ($line = fgets($file)) bei dieser Zeile vorzeitig enden. Vergleichen Sie immer mit !== false.
Zeile für Zeile mit feof() lesen
Sie werden die Schleife auch mit feof() geschrieben sehen, das true zurückgibt, sobald das Dateiende erreicht wurde:
<?php
$file = fopen("file.txt", "r");
while (!feof($file)) {
$line = fgets($file);
if ($line === false) {
break; // guard against a read failure mid-loop
}
echo $line;
}
fclose($file);Beide Stile sind korrekt. Die !== false-Variante wird in der Regel bevorzugt, da feof() erst true wird, nachdem ein Lesevorgang fehlgeschlagen ist — was bei Unachtsamkeit zu einer zusätzlichen leeren Iteration führen kann.
Die Zeilenlänge begrenzen
Übergeben Sie $length, um zu steuern, wie viel einer langen Zeile auf einmal gelesen wird. Hier werden nur die ersten 9 Bytes ($length - 1) jedes Abschnitts zurückgegeben:
<?php
$file = fopen("file.txt", "r");
// "Hello, world!" is read in pieces of at most 9 bytes
echo fgets($file, 10); // "Hello, wo"
echo "\n";
echo fgets($file, 10); // "rld!" (rest of the line)
fclose($file);Das ist praktisch, um sich vor extrem langen Zeilen zu schützen, aber bei normalen Textdateien können Sie $length weglassen.
Benutzereingaben vom Terminal lesen
Da fgets() auf jedem Stream funktioniert, ist es die klassische Methode, um eine vom Benutzer auf der Kommandozeile eingetippte Zeile zu lesen:
<?php
echo "What is your name? ";
$name = rtrim(fgets(STDIN), "\r\n"); // strip the Enter key's newline
echo "Hello, $name!\n";STDIN ist eine vordefinierte Konstante für php://stdin.
Häufige Stolperfallen
- Der abschließende Zeilenumbruch ist enthalten. Verwenden Sie
rtrim($line, "\r\n")beim Vergleichen oder Speichern von Werten. - Mit
!== falsetesten, nicht nur auf Wahrheitswert prüfen, damit Zeilen wie"0"oder""die Schleife nicht vorzeitig beenden. fgets()benötigt ein gültiges, geöffnetes Handle. Wennfopen()falsezurückgegeben hat (fehlende Datei, falsche Berechtigungen), löst die Übergabe anfgets()eine Warnung aus. Prüfen Sie das Handle zuerst.- Vergessen Sie
fclose()nicht. PHP schließt Handles am Skriptende, aber sie explizit freizugeben ist gute Praxis, besonders in lang laufenden Skripten. - Für das Lesen ganzer Dateien sind einfachere Werkzeuge zu bevorzugen. Wenn Sie keine zeilenweise Kontrolle benötigen, gibt
file()die Datei als array von Zeilen zurück undfile_get_contents()gibt sie als einzelnen string zurück.
Verwandte Funktionen
fopen()— eine Datei oder einen Stream öffnen (vorfgets()erforderlich).fread()— eine feste Anzahl von Bytes lesen, keine Zeilen.fgetc()— ein einzelnes Zeichen lesen.fgetcsv()— eine Zeile lesen und als CSV parsen.feof()— auf Dateiende prüfen.fclose()— das Handle schließen.
Fazit
fgets() liest eine Datei Zeile für Zeile und gibt jede Zeile (mit Zeilenumbruch) zurück, bis das Dateiende erreicht ist, wo false zurückgegeben wird. Kombinieren Sie es mit fopen() und fclose(), steuern Sie die Schleife mit einem strikten !== false-Test und denken Sie daran, rtrim() auf den Zeilenumbruch anzuwenden, wenn Sie den bereinigten Wert benötigen. Bei sehr großen Dateien hält dies die Speicherauslastung konstant niedrig und macht fgets() zur ersten Wahl für das Streaming von Text in PHP.