[PHP-users 21861]Re: Content-Lengthヘッダの出力方法
komura
komura @ ma9.seikyou.ne.jp
2004年 5月 27日 (木) 16:31:31 JST
komura です。
On Thu, 27 May 2004 13:55:21 +0900
Atsushi NAGAI <nagai @ asahi-pj.co.jp> wrote:
> [関係しそうな php.iniエントリ]
> output_buffering = On
> output_handler = mb_output_handler
> mbstring.language = Japanese
> mbstring.internal_encoding = EUC-JP
> mbstring.http_input = SJIS
> mbstring.http_output = SJIS
>
> ターゲットはとりあえず DoCoMo だけなのですが、
> DoCoMo の資料には、Content-Lengthヘッダが必須だとあります。
> じゃ、Content-Lengthヘッダを出しましょうかね、と思ったのですが、
> どう実装するのが、一般的な解なのでしょう?
>
> ぱっと思いついたのは、コンテンツを吐く直前にサイズを調べて
> ヘッダ出力するという以下の 2つです。
>
> b) PHP の output_handler を使う。
> 現状の output_handler = mb_output_handler をやめて、
> Content-Lengthヘッダ出力用ハンドラを用意してエントリする。
> # 実際は、ob_start() でハンドラ登録となるでしょうか。
> そのハンドラ内では、
> ・mb_output_handler() で EUC→SJIS変換。
> ・変換後のバッファ内容から Content-Lengthヘッダ出力。
> ・mb_output_handler() の戻り値を返す。
>
> この方法を試そうと思ったのですが、
> string mb_output_handler(string contents, int status)
> の status に何を与えればよいのか不明で保留してます。
> # マニュアル説明では「status: 出力バッファのステータス」と
> # しか記述がない・・・。
>
> 普通はこうやるよ、とか、a)b) の方法でこうやると望み通りに
> なるよ、といったアドバイスがあればお聞かせ下さい。
ob_start() のマニュアルの例を見て、以下のようなスクリプトを作成して
試してみました。
http://jp.php.net/manual/ja/function.ob-start.php
特に問題なく動いているように見えましたが、どうでしょうか。
function callback( $contents )
{
$contents = mb_convert_encoding( $contents, 'SJIS-win' );
header( 'Content-Type: text/html; charset=Shift_JIS' );
header( 'Content-Length: ' . strlen( $contents ) );
return $contents;
}
ob_start( 'callback' );
php.ini の以下の指定はコメントアウトした状態で確認しました。
output_handler = mb_output_handler
mbstring.http_input = SJIS
mbstring.http_output = SJIS
--
komura <komura @ ma9.seikyou.ne.jp>
PHP-users メーリングリストの案内