Signatur
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
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);
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;
// 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.