[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 メーリングリストの案内