[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>