Start · Sprachen · PHP · Referenz · stream_set_read_buffer

stream_set_read_buffer

Funktion

Setzt die Größe des Lesepuffers für einen geöffneten Stream-Ressource.

seit PHP 5.3.3 Kategorie: io

Signatur

stream_set_read_buffer(resource $stream, int $size): int

Beschreibung

stream_set_read_buffer() legt fest, wie viele Bytes beim Lesen eines Streams intern gepuffert werden sollen. Der Parameter size gibt die gewünschte Puffergröße in Bytes an. Wird 0 übergeben, wird die Pufferung deaktiviert (ungepuffertes Lesen).

Standardmäßig arbeiten Streams mit einem internen Puffer, was die Performance bei vielen kleinen Lesevorgängen verbessert. Für Anwendungsfälle, in denen Daten sofort bei Verfügbarkeit gelesen werden müssen – etwa bei Echtzeit-Kommunikation über Netzwerk-Sockets oder bei der Interprozesskommunikation – kann es sinnvoll sein, die Pufferung zu reduzieren oder vollständig zu deaktivieren.

Die Funktion ist das Gegenstück zu stream_set_write_buffer() und beeinflusst ausschließlich den Lesepuffer. Sie wirkt auf alle Stream-Typen, für die das zugrunde liegende System die Einstellung unterstützt, also z. B. Datei-Streams oder Netzwerk-Streams.

Beachte, dass die Betriebssystem- und PHP-Stream-Implementierung die gewünschte Puffergröße möglicherweise nicht exakt umsetzen kann; die Funktion liefert daher einen Rückgabewert, um Erfolg oder Misserfolg anzuzeigen.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Eine geöffnete Stream-Ressource, z. B. das Ergebnis von fopen() oder stream_socket_client().
$size Pflicht int Gewünschte Puffergröße in Bytes. Der Wert 0 deaktiviert die Lesepufferung vollständig (ungepufferter Modus).

Rückgabewert

Typ
int
Beschreibung
Gibt 0 zurück, wenn die Pufferung erfolgreich gesetzt wurde. Jeder andere Wert zeigt an, dass die Einstellung nicht vollständig übernommen werden konnte.

Beispiele

Lesepufferung für eine Datei deaktivieren

<?php
// Datei öffnen und Lesepufferung komplett abschalten
$handle = fopen('daten.bin', 'rb');
if ($handle === false) {
    die('Datei konnte nicht geöffnet werden.');
}

$result = stream_set_read_buffer($handle, 0);
if ($result === 0) {
    echo "Lesepufferung erfolgreich deaktiviert.\n";
} else {
    echo "Puffereinstellung konnte nicht gesetzt werden.\n";
}

// Daten lesen ohne internen Puffer
$chunk = fread($handle, 64);
echo bin2hex($chunk) . "\n";

fclose($handle);
Lesepufferung erfolgreich deaktiviert.

Echtzeit-Lesen von einem Netzwerk-Socket

<?php
// TCP-Verbindung zu einem Server herstellen
$socket = stream_socket_client('tcp://example.com:80', $errno, $errstr, 5);
if ($socket === false) {
    die("Verbindungsfehler $errno: $errstr");
}

// Pufferung deaktivieren, damit Daten sofort verfügbar sind
stream_set_read_buffer($socket, 0);
stream_set_blocking($socket, false);

// HTTP-Anfrage senden
fwrite($socket, "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n");

// Antwort stückchenweise lesen
$response = '';
while (!feof($socket)) {
    $data = fread($socket, 512);
    if ($data !== false && $data !== '') {
        $response .= $data;
    }
}

fclose($socket);
echo substr($response, 0, 100) . "\n";

// Wichtig · Fallstricke

Kompatibilität: Nicht alle Stream-Wrapper und Betriebssysteme unterstützen die Einstellung des Lesepuffers. Prüfe immer den Rückgabewert, um sicherzustellen, dass die Puffereinstellung übernommen wurde.

Performance: Das vollständige Deaktivieren der Pufferung (size = 0) kann bei sehr häufigen kleinen Lesevorgängen die Performance verschlechtern, da jeder fread()-Aufruf direkt auf das Betriebssystem zugreift. Setze die Pufferung nur dann auf 0, wenn Latenz wichtiger als Durchsatz ist.

Zusammenspiel mit stream_set_blocking(): Für nicht-blockierende Streams ist das Deaktivieren der Lesepufferung besonders relevant, da sonst Daten im Puffer verbleiben könnten und nicht sofort gelesen werden.