2

提供されるファイルの content-length の設定に関する記事をいくつか読みました。チャンクダウンロードと比較して、いくつかの利点があります。コンテンツの長さが不明な場合、サーバーはチャンクを提供します(チャンクのサイズはとにかくわかりません)。

PHP では、ob_gzhandler を使用して、html、js、css ファイル、およびその他のテキストベースのコンテンツを gzip します。gzip 出力の前にraw content-lengthを設定すると、長さが gzip された出力の長さと一致しないため、奇妙な副作用が発生します。遅延が発生するか、ブラウザーがエンコード エラーを報告します。

gzip圧縮後にコンテンツの長さを設定して、正しいサイズが報告されるようにするトリック(stackoverflowでも)を見ました。しかし、これを行うと、コンテンツは圧縮されなくなります。

問題は、この動作が正しいかどうかです。gzip されたコンテンツは常にチャンクされて送信されますか? content-length は gzip されていないファイルにのみ必要ですか?

コードの一部を次に示します。

1 gzip およびチャンク化されたファイル転送の結果:

ob_start('ob_gzhandler');
echo $sResult;

2 content-length が指定された通常のファイル転送になります (ただし、gziped と content-length は想定されます):

ob_start('ob_gzhandler');
echo $sResult;
header('Content-Length: '.ob_get_length()); 

ここに http ヘッダーの結果のいくつかの写真があります: 1 Gzip およびチャンク

2 content-length を設定すると、Gzip されたが通常の転送が期待される

4

1 に答える 1

2

ここで解決策/トリックを見つけました: gzip されたファイルの Content-Length を決定する方法は?

これにしました:

// clear output buffers
while( ob_get_level() )
 { ob_end_clean(); }

< send http headers here >

ob_start();
ob_start('ob_gzhandler');
echo $sResult;
if( !headers_sent() )
{
   ob_end_flush(); // Flush the output from ob_gzhandler
   header('Content-Length: '.ob_get_length());
   ob_end_flush(); // Flush the outer ob_start()
}

なぜこれが機能するのかはわかりませんが、完全に機能しているようです。コンテンツは現在 gzip されており、コンテンツの長さがあります (チャンクではありません)。

それを証明するために、ここにスクリーンショットがあります:

gzip とコンテンツの長さ

乾杯!;-)

于 2013-12-02T23:02:19.043 に答える