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