[PHP-users 12255] Re: flushについて

Mashiki php-users@php.gr.jp
Tue, 17 Dec 2002 10:11:00 +0900


 Mashikiです。

>このMLでも過去何回か話題にあがりましたが、
>結局のところループ中のflushってうまく動作しないのでしょうか?
>
>動かそうとしているのは
>for($i = 0; $i < 100 ; $i++){
> echo "$i\n";
> flush();
> sleep(3); 
>}
>
>このようなスクリプトで環境は
>PHP4.2.3 (winXP SP1)
>PHP4.4.0dev (FreeBSD4.6.2)
>で、ブラウザはIE6SP1です。

可能であれば、アウトプットバッファリングをしないで上記を
試してみてはいかがでしょうか。またブラウザによっては、
充分長い文字列を送信しないと、表示を始めないものもある
らしいです。

またアウトプットバッファリングを利用する場合、以下を記述し
ループの中のflushをMyFlushに置き換えます。

function MyFlush($buf) {
  flush();
  ob_end_flush();
  ob_start();
}


アウトプットバッファリングにmb_output_handlerを使用している
場合(これが普通のケース)、4.1.xと4.2.xにより挙動が変わるので

function MyFlush() {
  flush();
  $buf = ob_get_contents();
  ob_end_clean();
  echo mb_convert_encoding($buf, mb_http_output());
  ob_start();
}

と自前で変更をコントロールしないと、文字化けなどで悩むこと
になります。(4.1.xなどではもっとキレイにかけるのですが)
また、最後のマルチバイト文字列の出力のあと、必ずMyFlush()を
呼ぶ必要があります。

4.3、4.4系は試していませんが、参考まで。