Signatur
Beschreibung
flush() veranlasst PHP, den Inhalt seines internen Ausgabepuffers sowie aller darunter liegenden Systempuffer an den Webserver und letztlich an den Browser zu schicken. Dies ist besonders nützlich bei lang laufenden Skripten, bei denen der Nutzer während der Verarbeitung schrittweise Rückmeldungen erhalten soll – beispielsweise Fortschrittsanzeigen, Streaming-Ausgaben oder schrittweise gerenderte HTML-Seiten.
Es ist wichtig zu verstehen, dass flush() nur den PHP-eigenen Ausgabepuffer leert. Wenn zusätzlich Output-Buffering über ob_start() aktiviert wurde, muss zuerst ob_flush() aufgerufen werden, um den ob-Puffer zu leeren, bevor flush() die Daten tatsächlich an den Client weiterleiten kann.
In vielen modernen Webserver- und Proxy-Konfigurationen (z. B. Apache mit mod_gzip, Nginx oder CDNs mit Kompression/Caching) kann flush() keine sofortige Wirkung haben, da der Webserver oder ein zwischengeschalteter Proxy die Daten selbst puffert. In solchen Szenarien kann es helfen, die Ausgabe-Komprimierung zu deaktivieren oder entsprechende Header zu setzen.
Für den Einsatz in CLI-Skripten kann flush() dazu verwendet werden, sicherzustellen, dass Ausgaben sofort auf der Konsole erscheinen und nicht im Puffer verbleiben.
Rückgabewert
Beispiele
Schrittweise Fortschrittsausgabe im Browser
<?php
// Wichtig: ob-Puffer deaktivieren oder zuerst leeren
if (ob_get_level() > 0) {
ob_end_clean();
}
header('Content-Type: text/html; charset=UTF-8');
// Fülle anfänglich den Puffer auf, damit Browser Content sofort rendert
echo str_pad('', 4096) . "\n";
flush();
for ($i = 1; $i <= 5; $i++) {
echo "Schritt $i von 5 abgeschlossen...<br>\n";
flush();
sleep(1); // simuliert Verarbeitungszeit
}
echo "Alle Schritte abgeschlossen!\n";
Kombination von ob_flush und flush
<?php
// Output-Buffering wurde zuvor aktiviert
ob_start();
for ($i = 1; $i <= 3; $i++) {
echo "Verarbeite Datensatz $i...\n";
ob_flush(); // Leert den ob-Puffer in den PHP-Puffer
flush(); // Sendet den PHP-Puffer an den Client
usleep(500000); // 0.5 Sekunden warten
}
ob_end_flush(); // Restlichen ob-Inhalt senden und Puffer schließen
// Wichtig · Fallstricke
Webserver-Puffer: flush() kann nur den PHP-seitigen Puffer leeren. Webserver wie Nginx oder Apache sowie vorgelagerte Proxys und CDNs können die Daten trotzdem puffern. Um dies zu umgehen, kann für Nginx die Direktive fastcgi_buffering off; oder der Header X-Accel-Buffering: no verwendet werden.
Komprimierung: Wenn zlib.output_compression in der php.ini aktiviert ist oder ob_gzhandler verwendet wird, hat flush() unter Umständen keine unmittelbare Wirkung, da die Komprimierung eine vollständige Ausgabe erfordert. In solchen Fällen muss die Komprimierung deaktiviert werden.
CLI-Skripte: Im CLI-Kontext ist flush() meist weniger kritisch, da STDOUT in der Regel nicht gepuffert wird. Es kann jedoch je nach Betriebssystem und Umgebung trotzdem hilfreich sein.