Start · Sprachen · PHP · Referenz · stream_set_write_buffer

stream_set_write_buffer

Funktion

Setzt die Größe des Schreibpuffers für einen offenen Stream; bei einer Größe von 0 wird ungepuffert geschrieben.

seit PHP 4.3.0 Kategorie: io

Signatur

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

Beschreibung

stream_set_write_buffer() steuert, wie viele Bytes PHP intern puffert, bevor Daten tatsächlich in den darunterliegenden Stream (Datei, Socket usw.) geschrieben werden. Standardmäßig arbeiten Streams gepuffert, d. h. PHP sammelt Daten im Speicher und überträgt sie gebündelt, was die Anzahl der teuren Systemaufrufe reduziert.

Wird $size auf 0 gesetzt, schaltet die Funktion auf ungepuffertes Schreiben um: Jeder fwrite()-Aufruf wird sofort an das Betriebssystem weitergegeben. Das ist besonders sinnvoll für Echtzeit-Ausgaben, Log-Streams oder Netzwerk-Sockets, bei denen der Empfänger die Daten ohne Verzögerung erhalten muss.

Typische Einsatzgebiete sind Fortschrittsausgaben während langer Berechnungen, Server-Sent Events (SSE), interaktive CLI-Werkzeuge und Situationen, in denen nach einem Absturz möglichst vollständige Logs auf dem Medium gespeichert sein sollen.

Die Funktion ist ein Alias für set_file_buffer() und wirkt sich nur auf die PHP-seitige Pufferung aus; Kernel- oder Hardware-Buffer werden nicht beeinflusst. Für den Standard-Ausgabe-Stream kann alternativ ob_implicit_flush(true) kombiniert werden.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Eine gültige Stream-Ressource, z. B. das Ergebnis von fopen(), fsockopen() oder eine der vordefinierten Streams wie STDOUT.
$size Pflicht int Gewünschte Puffergröße in Byte. 0 aktiviert ungepuffertes Schreiben; positive Werte definieren die maximale Puffergröße, nach deren Erreichen PHP automatisch schreibt.

Rückgabewert

Typ
int
Beschreibung
Gibt 0 zurück, wenn die Pufferung erfolgreich gesetzt wurde. Ein Wert ungleich 0 zeigt an, dass die Anfrage fehlgeschlagen ist (z. B. weil der Stream-Wrapper die Operation nicht unterstützt).

Beispiele

Ungepuffertes Schreiben in eine Logdatei

<?php
$log = fopen('/var/log/mein_prozess.log', 'a');
if ($log === false) {
    exit('Datei konnte nicht geöffnet werden.');
}

// Schreibpuffer deaktivieren — jede Zeile wird sofort gespeichert
$result = stream_set_write_buffer($log, 0);
if ($result !== 0) {
    echo 'Warnung: Pufferung konnte nicht deaktiviert werden.' . PHP_EOL;
}

for ($i = 1; $i <= 5; $i++) {
    fwrite($log, date('Y-m-d H:i:s') . " — Schritt {$i} abgeschlossen" . PHP_EOL);
    sleep(1); // Simuliert langsame Verarbeitung
}

fclose($log);

Echtzeit-Ausgabe auf STDOUT (CLI)

<?php
// Ungepufferte Ausgabe auf die Standardausgabe
stream_set_write_buffer(STDOUT, 0);

$schritte = 10;
for ($i = 1; $i <= $schritte; $i++) {
    fwrite(STDOUT, "Fortschritt: {$i}/{$schritte}\r");
    usleep(300_000); // 300 ms
}
fwrite(STDOUT, PHP_EOL . 'Fertig!' . PHP_EOL);
Fortschritt: 10/10 Fertig!

Gepufferte Schreibvorgänge mit definierter Puffergröße

<?php
$fp = fopen('ausgabe.bin', 'wb');
if ($fp === false) {
    exit('Konnte Datei nicht öffnen.');
}

// Puffer auf 8 KiB setzen — sinnvoll für sequenzielle Bulk-Writes
stream_set_write_buffer($fp, 8192);

$daten = str_repeat('A', 1024); // 1 KiB Nutzdaten
for ($i = 0; $i < 100; $i++) {
    fwrite($fp, $daten);
}

fclose($fp);
echo 'Schreiben abgeschlossen. Dateigröße: ' . filesize('ausgabe.bin') . ' Byte' . PHP_EOL;
Schreiben abgeschlossen. Dateigröße: 102400 Byte

// Wichtig · Fallstricke

Rückgabewert beachten: Nicht alle Stream-Wrapper unterstützen das Ändern der Pufferung. Prüfe den Rückgabewert und behandle den Fehlerfall, um stille Fehler zu vermeiden.

Nur PHP-seitige Pufferung: Die Funktion steuert ausschließlich den PHP-internen Puffer. Betriebssystem-Caches (Page Cache) und Hardware-Write-Caches bleiben unberührt. Für garantiertes Schreiben auf das physische Medium ist zusätzlich fflush() oder — auf Betriebssystemebene — fsync() nötig.

Netzwerk-Sockets: Bei TCP-Sockets kann es trotz size = 0 durch den Nagle-Algorithmus des Betriebssystems zu Verzögerungen kommen. In solchen Fällen hilft stream_set_blocking() oder das Setzen der Socket-Option TCP_NODELAY via socket_set_option().

Alias: stream_set_write_buffer() ist der moderne Name für die veraltete Funktion set_file_buffer(), die seit PHP 7.0 als deprecated gilt.