GZIP (GNU-ZIP) は圧縮テクノロジーです。 GZIP 圧縮後、ページ サイズは元のサイズの 30%、またはさらに小さくなることがあります。こうすることで、ユーザーは閲覧中に爽快感と幸福感を得ることができます。
GZIP 圧縮ページを実装するには、ブラウザとサーバーの両方がサポートされている必要があります。実際には、ブラウザに送信された後、ブラウザが圧縮を解除して解析します。現在、ほとんどのブラウザは GZIP ページの解析をサポートしているため、ブラウザについて心配する必要はありません。サーバー側でページを圧縮してブラウザに出力するだけです。
少しくどいので本題に入りましょう:
圧縮ビスケットを作りたいのと同じように、まず原材料を入手する必要があります。また、ページを圧縮したい場合は、まず出力するコンテンツを入手する必要があります。 PHP の ob_start() (ob => 出力バッファ) 関数は、この機能を実現します。これは、プログラム内で出力するコンテンツを最初に「バッファ」と呼ばれる場所に置くことができます。 . 原材料を一時的に置くための作業台。
この関数はページが出力される前に使用する必要があるため、通常はコードの先頭に配置されます。作業台のようなものなので、原材料が到着する前に準備しておかないと、原材料が到着したときに置き場所がなくて問題が発生します。 ob_start() を使用してページを圧縮した後、圧縮 Cookie を作成できます。いいえ、ページは圧縮されている必要があります。しかし、コンプレッサー EZ がまだ不足しているようです。PHP の zlib 拡張機能を使用してコンプレッサーを作成します。
<font face="Youyuan">function ob_gzip( $content) // $content は圧縮するページのコンテンツ、またはビスケットの材料です <code id="code0"><font face="幼圆">function ob_gzip($content) // $content 就是要压缩的页面内容,或者说饼干原料<br>{ <br> if( !headers_sent() && // 如果页面头部信息还没有输出<br> extension_loaded("zlib") && // 而且zlib扩展已经加载到PHP中<br> strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip")) //而且浏览器说它可以接受GZIP的页面 <br> {<br> $content = gzencode($content." n//此页已压缩",9); 为准备压缩的内容贴上“//此页已压缩”的注释标签,然后用zlib提供的gzencode()函数执行级别为9的压缩,这个参数值范围是0-9,0表示无压缩,9表示最大压缩,当然压缩程度越高越费CPU。<br> <br> //然后用header()函数给浏览器发送一些头部信息,告诉浏览器这个页面已经用GZIP压缩过了!<br> header("Content-Encoding: gzip"); <br> header("Vary: Accept-Encoding");<br> header("Content-Length: ".strlen($content));<br> }<br> return $content; //返回压缩的内容,或者说把压缩好的饼干送回工作台。<br>}</font>
压缩机做好了之后,我们把压缩机放到工作台上,于是原来的ob_start()变成
<font face="幼圆">ob_start('ob_gzip'); //没错,就是给ob_start()加一个参数,参数名就是我们刚才做的“压缩机”的函数名。这样当内容进入缓冲区后PHP就会调用ob_gzip函数把它压缩了。</font>
好了,所有的工作已完成,最后交货:
<font face="幼圆">ob_end_flush(); //结束缓冲区,输出内容。当然,不用这个函数也行,因为程序执行到最后会自动将缓冲区内容输出。</font>
{ if( !headers_sent() && // ページヘッダー情報がまだ出力されていない場合
extension_loaded("zlib") && //そして、zlib 拡張機能がロードされています PHP では、 r strstr ($ _server ["http_accept_encoding"], "gzip")) // そして、ブラウザは gzip のページを受け入れることができると言います {🎜 $ content = gzenCode ($ content . "N // このページは圧縮されています。 ",9); 圧縮するコンテンツに「//このページは圧縮されています」というコメント ラベルを付け、zlib が提供する gzencode() 関数を使用してレベル 9 を実行します。このパラメータの値の範囲は 0 ~ 9 です。0 は圧縮なしを意味し、9 は最大の圧縮を意味します。当然、圧縮の程度が高くなるほど、CPU のコストが増加します。 🎜 // 次に、header() 関数を使用してヘッダー情報をブラウザに送信し、このページが GZIP で圧縮されていることをブラウザに伝えます。 🎜 header("Content-Encoding: gzip"); 🎜 header("Vary: Accept-Encoding"); 🎜 header("Content-Length: ".strlen($content));クッキーをワークベンチに戻します。 🎜}🎜 コンプレッサーの準備ができたら、コンプレッサーをワークベンチに置き、元の ob_start() は 🎜🎜Code:🎜ob_start('ob_gzip'); //はい、ob_start() にパラメータを追加するだけです。パラメータ名は先ほど作成した「コンプレッサー」の関数名です。このようにして、コンテンツがバッファーに入ると、PHP は ob_gzip 関数を呼び出してコンテンツを圧縮します。
🎜OK、すべての作業が完了しました。最終納品: 🎜🎜Code:🎜<font face="Youyuan">ob_end_flush(); // を終了します。内容をバッファリングして出力します。もちろん、バッファの内容はプログラムの実行終了時に自動的に出力されるため、この関数は必要ありません。 </font>
🎜完全な例は次のとおりです:🎜<font face="幼圆"><?php<br />//启用一个带有ob_gzip压缩机的工作台<br />ob_start('ob_gzip');<br />//准备一些待压缩的内容<br />for($i=0; $i<100; $i++)<br />{<br /> echo('这里是压缩饼干的原料,这里是压缩饼干的原料,原料');<br />}<br />//输出压缩成果<br />ob_end_flush();<br />//这是ob_gzip压缩机<br />function ob_gzip($content) <br />{ <br /> if( !headers_sent() && <br /> extension_loaded("zlib") && <br /> strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip")) <br /> {<br /> $content = gzencode($content." n//此页已压缩",9); <br /> <br /> header("Content-Encoding: gzip"); <br /> header("Vary: Accept-Encoding");<br /> header("Content-Length: ".strlen($content));<br /> }<br /> return $content; <br />}<br />?></font>
実際のテスト後、上記のコードでGZIPが使用されていない場合、4.69KB = 4802.56Bになります。GZIPを有効にすると、104Bに削減されます、うーん...数学が苦手かもしれません。ので、自分で計算して元のパーセンテージに圧縮しました。 。