PHP zlib拡張実現ページGZIP圧縮出力

3273 ワード

GZIP圧縮ページを実現するには、ブラウザとサーバの共同サポートが必要であり、実際にはサーバ圧縮であり、ブラウザに転送された後、ブラウザは解凍し、解析する.ブラウザ側は心配する必要はありません.今ではほとんどのブラウザがGZIPのページを解析することをサポートしているからです.私たちはページをサーバ側で圧縮してブラウザに出力すればいいです.
ちょっとくどいですが、次は本題です.
圧縮ビスケットを作るように、まず原料を手に入れ、ページを圧縮するには、まず出力する内容を手に入れなければなりません.PHPのob_start()(ob=>output buffer)関数はこの機能を実現することができ、プログラムに出力される内容を「バッファ」という場所に置くことができます.もちろん、圧縮ビスケットを作る一時的な原料を置くテーブルとして理解できます.
この関数は必ずページ出力の前に使用するので、コードの最上位に置くのが一般的です.テーブルのようなものなので、原料が来る前に準備しなければなりません.そうしないと、原料が来て置く場所がなく、問題が発生します.ob_でstart()圧縮するページを手に入れたら、圧縮ビスケットを作ることができます.いいえ、圧縮できるはずです.しかし、圧縮機が1台欠けているようです.EZ、PHPベルトのzlibで拡張しました.
 
  
function ob_gzip($content) // $content ,
{
if( !headers_sent() && //
extension_loaded("zlib") && // zlib PHP
strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip")) // GZIP
{
$content = gzencode($content."
// ",9); “// ” , zlib gzencode() 9 , 0-9,0 ,9 , CPU。

// header() , GZIP !
header("Content-Encoding: gzip");
header("Vary: Accept-Encoding");
header("Content-Length: ".strlen($content));
}
return $content; // , 。
}

圧縮機ができたら、圧縮機をテーブルに置いて、元のob_start()が
ob_start('ob_gzip');//そう、ob_にstart()にパラメータを追加します.パラメータ名は私たちがさっき作った「圧縮機」の関数名です.これにより、コンテンツがバッファに入るとPHPがob_を呼び出すgzip関数はそれを圧縮した.
はい、すべての作業が完了し、最終的に納品されました.
ob_end_flush();//バッファを終了し、内容を出力します.もちろん、この関数を使わなくてもいいです.プログラムが実行されると、バッファの内容が自動的に出力されます.
完全な例は次のとおりです.
 
  
// ob_gzip
ob_start('ob_gzip');
//
for($i=0; $i<100; $i++)
{
echo(' , , ');
}
//
ob_end_flush();
// ob_gzip
function ob_gzip($content)
{
if( !headers_sent() &&
extension_loaded("zlib") &&
strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip"))
{
$content = gzencode($content."
// ",9);

header("Content-Encoding: gzip");
header("Vary: Accept-Encoding");
header("Content-Length: ".strlen($content));
}
return $content;
}
?>

実际のテストを経て、上のコードの中でGZIPを使わないならば、4.69 KB=4802.56 Bで、GZIPを有効にした后に104 Bに缩小して、ええと......私の数学はよくないかもしれなくて、自分で计算してもとのパーセントまで圧缩しました.
また、以下はFlashGetで取得したログ情報です.プログラムに追加されたヘッダー情報が表示されます.
 
  
Fri Jan 25 17:53:10 2008 HTTP/1.1 200 OK
Fri Jan 25 17:53:10 2008 Server: Microsoft-IIS/5.1
Fri Jan 25 17:53:10 2008 Date: Fri, 25 Jan 2008 09:53:10 GMT
Fri Jan 25 17:53:10 2008 Connection: close
Fri Jan 25 17:53:10 2008 X-Powered-By: PHP/5.2.5
Fri Jan 25 17:53:10 2008 Content-Encoding: gzip
Fri Jan 25 17:53:10 2008 Vary: Accept-Encoding
Fri Jan 25 17:53:10 2008 Content-Length: 104
Fri Jan 25 17:53:10 2008 Content-type: text/html