Start · Sprachen · PHP · Referenz · stream_get_line

stream_get_line

Funktion

Liest eine Zeile aus einer Stream-Ressource bis zum angegebenen Trennzeichen oder bis zur maximalen Länge.

seit PHP 5.0.0 Kategorie: io

Signatur

stream_get_line(resource $stream, int $length, string $ending = ""): string|false

Beschreibung

stream_get_line liest Daten aus einem Stream, bis entweder das in ending angegebene Trennzeichen gefunden wird, length Bytes gelesen wurden oder das Ende des Streams (EOF) erreicht ist. Im Unterschied zu fgets kann das Trennzeichen mehrere Zeichen umfassen und wird nicht im Rückgabewert mitgeliefert — es wird schlicht verworfen.

Diese Funktion ist besonders nützlich, wenn Protokolle oder Datenströme einen eigenen Zeilentrenner verwenden, der vom Standard-Zeilenumbruch (\n) abweicht, z. B. \r\n in vielen Netzwerkprotokollen wie HTTP, SMTP oder POP3. Gegenüber fgets bietet sie damit mehr Flexibilität bei der Verarbeitung solcher Ströme.

Der Parameter length legt die maximale Anzahl der zu lesenden Bytes fest. Ist er 0, wird bis zum Trennzeichen oder EOF gelesen, ohne eine Byte-Grenze zu setzen. Ist kein ending angegeben oder leer, verhält sich die Funktion wie fread mit dem angegebenen length-Wert.

Die Funktion gibt im Fehlerfall oder bei sofortigem EOF false zurück, daher sollte der Rückgabewert stets mit === false geprüft werden.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Eine gültige Stream-Ressource, z. B. von fopen, fsockopen oder stream_socket_client.
$length Pflicht int Maximale Anzahl der zu lesenden Bytes. Bei 0 wird keine Byte-Grenze gesetzt und nur anhand des Trennzeichens oder EOF gelesen.
$ending string Das Trennzeichen, bei dessen Auftreten das Lesen gestoppt wird. Das Trennzeichen selbst wird nicht in den Rückgabewert aufgenommen. Wird es weggelassen oder als leerer String übergeben, liest die Funktion bis zu length Bytes oder EOF.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den gelesenen Datenstrang als string zurück (ohne das Trennzeichen). Gibt false zurück, wenn ein Fehler aufgetreten ist oder beim ersten Leseaufruf bereits EOF erreicht wurde. Ein leerer String '' ist ein gültiger Rückgabewert, wenn das Trennzeichen am Anfang steht.

Beispiele

Zeilenweise Lesen aus einer Datei mit eigenem Trennzeichen

<?php
// Datei enthält Datensätze, getrennt durch '|END|'
$tmpFile = tempnam(sys_get_temp_dir(), 'sgl');
file_put_contents($tmpFile, "Datensatz 1|END|Datensatz 2|END|Datensatz 3|END|");

$stream = fopen($tmpFile, 'r');
if ($stream === false) {
    die('Datei konnte nicht geöffnet werden.');
}

while (($zeile = stream_get_line($stream, 1024, '|END|')) !== false) {
    echo 'Gelesen: ' . $zeile . PHP_EOL;
}

fclose($stream);
unlink($tmpFile);
Gelesen: Datensatz 1 Gelesen: Datensatz 2 Gelesen: Datensatz 3

Antwortzeile eines SMTP-Servers lesen

<?php
// Verbindung zu einem SMTP-Server herstellen
$socket = fsockopen('smtp.example.com', 25, $errno, $errstr, 5);
if ($socket === false) {
    die("Verbindung fehlgeschlagen: $errstr ($errno)");
}

// SMTP-Begrüßungszeile lesen (endet mit \r\n)
$antwort = stream_get_line($socket, 512, "\r\n");
if ($antwort === false) {
    echo 'Keine Antwort erhalten oder Fehler.';
} else {
    echo 'Server-Antwort: ' . $antwort . PHP_EOL;
}

fclose($socket);
Server-Antwort: 220 smtp.example.com ESMTP ready

// Wichtig · Fallstricke

Unterschied zu fgets: fgets liest bis \n und gibt das Trennzeichen im Ergebnis mit zurück. stream_get_line verwirft das Trennzeichen und erlaubt beliebige, auch mehrbuchstabige Trennzeichen.

Vorsicht bei length = 0: Ohne Längenbeschränkung kann eine fehlende oder nie auftretende Zeichenfolge dazu führen, dass die Funktion sehr große Datenmengen in den Speicher lädt. Im Produktionseinsatz sollte stets ein sinnvoller length-Wert angegeben werden.

Blocking-Streams: Bei blockierenden Sockets wartet die Funktion, bis Daten verfügbar sind oder ein Timeout eintritt. Für nicht-blockierende Streams sollte stream_set_blocking verwendet werden.