[PHP-users 7143] Re: Content-Lengthについて

Yasuo Ohgaki php-users@php.gr.jp
Thu, 25 Apr 2002 15:05:45 +0900


大垣です。

stormcat(Tatsuya Satoh) wrote:
> こんにちわ。佐藤です。
> 
> cha14320> として実行してみたのですが、どうもサーバ側でリクエストを受け付けてから
> cha14320> 完了するまでに不必要な時間がかかっているように思えるのです。
> cha14320> snifferでデータを取得してみたところ、単純なHTMLを表示している場合と
> cha14320> 上記の様にContent-Lengthヘッダを出力している場合で、17秒近く差異が
> cha14320> 出てきているように見えます。
> 
> 上記の件について自己レスなんですが、あくまで差異が出ているのは
> sniffer上での話で、表示自体は表面上は同じスピードで表示されます。
> また、コンテンツの長さによって終了までの時間も変わってくるようです。
> 同じ内容を表示していても、3K程度のHTMLを吐かせている際にContent-Lengthを
> 出力している場合、上記の現象が発生しますが、100Kに満たない様な
> コンテンツの場合、特に上記の現象は発生しない模様です。

何か不具合の気配がします。

ところで、Content-Lengthを出力する場合はCall Back関数を指定する
事をお勧めします。

_header_content_lentgth($buf) {
  $tmp = $buf; // $bufを書き換えるとクラッシュするので書き換えない
               // で下さい。たぶん、自分で直さないと誰も直してくれな
い、、、
  header("Content-Length: ".strlen($buf);
  return $tmp;
}

ob_start('_header_content_length');


できれば、PHP 4.3.0ではアウトプットバッファーをphp.iniで有効に設定
した場合は自動的にContent-Lengthを出力できるようにしておきます。

> それで思ったのが、ob_end_flush()が何かいたずらをしているのかな?
> と言うことなんですが。

実はob_end_*()にはまだ、問題があります。。。
問題の確認はできていますが、見当はついているのですがどこが
悪いか調べていません。

ob_end_*()でクラッシュしたり、非常におかしな動作をする
事は少なくなりましたが、全てのバッファーが削除された状態から
さらにob_end_*()を連続して呼ぶとおかしな動作をします。

対処策はob_get_status()を利用するかob_end_*()の戻り値
がFALSEになるまでob_end_*()を呼ぶと正常に動作すると思い
ます。

バッファーを使って、error発生時に全く別のページを表示したい
方(私はこの為に、Output Bufferを修正しました)は、

for(;ob_end_clean(););

等と実行すると問題無く削除が必要なバッファー全てを削除
できると思います。
別の不具合がある場合はぜひ教えて下さい。

--
Yasuo Ohgaki




__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!  http://bb.yahoo.co.jp/