phpでバッファリングを制御する時の注意点

phpで、データベースに対して大量のデータの検索をおこなって一覧表示をするような時、進行状況の経過を表示したいケースがよくある。
それは、主に次の2点の理由からで、
1)結果が長い時間返らずにブラウザの表示が変わらないままだと、処理が動いているのかどうかわからず、ユーザーが不安になる。
2)長い時間ブラウザにデータが渡されない状態が続くと、ブラウザが勝手にタイムアウトして、表示を中断してしまう。
特に2)は深刻で、ブラウザのタイムアウト時間より長い時間がかかる処理の場合、ブラウザから実行不可能ということになってしまう。Internet Explorerのタイムアウト時間を延ばすにはレジストリを変更しなくてはならず、簡単ではないので、ブラウザ側のタイムアウト時間を延ばすというのは現実的ではない。
通常は、ページのHTML作成が完了してから、ブラウザにその内容がまとめて渡されるので、phpで処理が完了するまでは、ブラウザに途中の内容は表示されない。
処理完了前に経過を表示させるには、出力データのバッファリングとフラッシュをおこなう必要がある。
phpには、バッファリングをおこなう関数「ob_****()」とフラッシュをおこなう関数「flush()」があるが、使い方がわかりにくいので、使用上の注意点をまとめておく。
【注意点1】
mb_output_handlerが設定されている場合、flush()だけ呼び出しても出力されない。また、ob_flush()だけ呼び出しても出力されない。flush()とob_flush()の両方を呼び出す必要がある。
【注意点2】
flush()を実行するには、出力バッファが無いことが条件になる。
注意点1、2から、この順番で実行をする必要がある。
——————–
ob_flush();
flush();
——————–
【注意点3】
<TABLE>タグの内側の記述は、</TABLE>タグによって閉じられるまでの間、出力されない。
そのため、<TABLE>の内側を出力している最中は、バッファリングをおこなってもブラウザ上の見た目は変化しない。
ブラウザによって、タグが閉じられる前から出力をおこなうブラウザもあるが、<TABLE>タグが閉じられてから、セル幅などを調整して出力をすることが標準動作のようなので、出力したいメッセージは<TABLE>タグの外側に記述をするようにする。これを忘れると、バッファリングを指定しているはずなのに、何故かブラウザに何も表示されない、という事態になる。
※<TABLE>タグの内側でも<SCRIPT>タグは動作するので、JavaScriptを利用して<TABLE>タグ外の位置にテキストを出力することは出来る。