[PHP-users 21860]Content-Lengthヘッダの出力方法

Atsushi NAGAI nagai @ asahi-pj.co.jp
2004年 5月 27日 (木) 13:55:21 JST


こんにちは。永井といいます。

現在、以下の環境で携帯向けシステムを作成してます。

[環境]
Redhat 9
Apache 2.0.48
PHP 4.3.4
Smarty 2.5.0

[関係しそうな 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つです。

a) Smarty のアウトプットフィルタを使う。
    // 画面表示処理
    $smarty = new Smarty;
    $smarty->assign(...);
    $smarty->register_outputfilter("put_content_length");
    $smarty->display(...);

    // Content-Lengthヘッダ出力用フィルタ
    function put_content_length($tpl_output, &$smarty) {
        header('Content-Length: '.strlen($tpl_output));
        return $tpl_output;
    }

 この方法だと、
 ・異常にレスポンスが遅くなった。原因不明。
 ・EUC→SJIS変換される前の length を数えることになるため、
  コンテンツ内に半角カナがあると実サイズの方が小さくなる。
  (EUC 2バイト→変換後 SJIS 1バイトのため?)
 という結果でした。

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) の方法でこうやると望み通りに
なるよ、といったアドバイスがあればお聞かせ下さい。

宜しくお願いします。

-- 
Atsushi NAGAI <nagai @ asahi-pj.co.jp>




PHP-users メーリングリストの案内