Zeilenweise Text zum Browser streamen.

Ich wollte im Browser eine zeilenweise Ausgabe erzwingen und habe gemogelt, was das Zeug hält nur um es allein in PHP umzusetzen.

Naja, es funktioniert auf jeden Fall.

set_time_limit(0);

// Streaming-Setup: gzip/deflate aus, alle Puffer-Ebenen schließen, implicit flush an.
if (function_exists('apache_setenv')) {
    apache_setenv('no-gzip', '1');
}
@ini_set('zlib.output_compression', 'Off');
header('Content-Encoding: none');
while (ob_get_level() > 0) {
    ob_end_flush();
}
ob_implicit_flush(true);

// Mini-HTML-Preamble + Padding, 
// damit Firefox/Safari den Render-Threshold (~1 KB) erreichen.
echo "<!doctype html><meta charset=utf-8><title>fetch</title>\n";
echo str_repeat(' ', 1024) . "\n";
flush();

// Apache mod_proxy_fcgi puffert FastCGI-Pakete ohne flushpackets=on;
// per-line padding drückt jede Zeile über die Puffer-Schwelle und erzwingt Auslieferung.
$line = static function (string $line): void {
    echo $line . str_repeat(' ', 4096) . "\n";
};

// Ausgabe
for ($i = 1; $i <= 10; $i++) {
    line($i.'<br>');
    sleep(1);
}