PHP :: イディオム / ブラウザで逐一出力を実現する

PHP は通常、アウトプットバッファリングが有効になっているため、ブラウザから以下のようなスクリプトを実行しても逐一表示されません。

<?php
 
for ($i = 0; $i < 50; $i++) {
    echo '|';
    sleep(1);
}
 
?>

上記を実行しても、リクエストから 50秒後 に一気に

||||||||||||||||||||||||||||||||||||||||||||||||||

が表示されます。



10秒後に

||||||||||

30秒後に

||||||||||||||||||||||||||||||

と表示させるには、以下のように ob_end_flush() でアウトプットバッファリングをオフにして、echo の後に flush() で出力バッファをフラッシュします。

<?php
 
ob_end_flush();
for ($i = 0; $i < 50; $i++) {
    echo '|';
    flush();
    sleep(1);
}
 
?>


[重要]
上記で逐一表示されない場合には、.htaccess に一行

mod_gzip_on Off

と記述すると良いようです。