[PHP-users 11022] アウトプットバッファの途中出力後の文字化け

Mashiki php-users@php.gr.jp
Tue, 22 Oct 2002 12:14:43 +0900


Mashikiです。

php4.1.2で動作したスクリプトを4.2.2で実行しようとして
少々困った状況に陥ってしまいました。

 PHPのスクリプトは時間のかかる処理も、かからない処理も
アウトプットバッファリングを利用し、内部エンコーディングは
EUCで、ブラウザへの出力をSJISで行なっています。

そのため、共通関数echoNow()を用意し、時間のかかる処理では
要所で出力をechoからechoNow()に書き換えて

・ブラウザをタイムアウトさせない
・ユーザーを少しでも安心させる

ために、途中経過を表示したいと考えます。


以前(4.1.2)はechoNowを

// リアルタイム出力
function echoNow($buf) {
  echo $buf;
  flush();
  ob_end_flush();
  ob_start("mb_output_handler");
}

のように定義すれば期待通りの動作を得ることができました。

しかしphp4.2.2では、上記は2回目のechoNow呼び出し以降、出力が
文字化け(EUCで出力)してしまいます。

どなたか、解決のためのヒントをいただけないでしょうか。


関係しそうなphp.iniの設定は両バージョンとも以下のとおりです

【php.ini】
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
 output_buffering           1 
 output_handler             mb_output_handler

 mbstring.detect_order      auto
 mbstring.http_input        auto 
 mbstring.http_output       SJIS
 mbstring.internal_encoding EUC-JP
 mbstring.substitute_character no value 



【再現用ソース】
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
<html><head></head></body><h2>FLUSHテスト</h2>
<?php
for ($ii=1;$ii<=5;++$ii) {
  echoNow("$ii 回目の出力 ".strftime("%H:%M:%S")."<br>\n");
  sleep(5);
}

// リアルタイム出力
function echoNow($buf) {
  echo $buf;
  flush();
  ob_end_flush();
  ob_start("mb_output_handler");
}
?>
</body></html>