ホームページ  >  記事  >  バックエンド開発  >  php gzip圧縮出力の実装方法_PHPチュートリアル

php gzip圧縮出力の実装方法_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:11:17977ブラウズ

一、gzip介绍

         gzip是GNU zip的缩写,它是一个GNU自由软件的文件压缩程序,也经常用来表示gzip这种文件格式。软件的作者是Jean-loup Gailly和Mark Adler。1992年10月31日第一次公开发布,版本号是0.1,目前的稳定版本是1.2.4。

        Gzip主要用于Unix系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。 当应用Gzip压缩到一个纯文本文件时,效果是非常明显的,经过GZIP压缩后页面大小可以变为原来的40%甚至更小,这取决于文件中的内容。

HTTP プロトコル上の GZIP エンコードは、WEB アプリケーションのパフォーマンスを向上させるために使用されるテクノロジーです。 Web 開発では、gzip を使用してページを圧縮し、Web サイトのトラフィックを削減できます。ただし、gzip は CPU をあまり占有しませんが、増加はわずか数パーセントですが、ページを 30% 以上圧縮できます。費用対効果が高い。

Apache の Gzip モジュールを使用すると、Gzip 圧縮アルゴリズムを使用して、Apache サーバーによって公開された Web コンテンツを圧縮し、クライアントのブラウザーに送信できます。この圧縮により、実際にネットワーク上で送信されるバイト数が削減されます (送信のためのネットワーク I/O が節約されます)。最も明白な利点は、Web ページの読み込みを高速化できることです。

Web ページの読み込みが高速化する利点は、トラフィックを節約し、ユーザーのブラウジング エクスペリエンスを向上させることに加えて、Gzip と検索エンジン クローラーとの関係が改善されることも明らかです。たとえば、Google は gzip ファイルを直接読み取ることで、通常の手動クロールよりも速く Web ページをクロールできます。 Google ウェブマスター ツールでは、sitemap.xml.gz がサイトマップとして直接送信されていることがわかります。

これらの利点は静的コンテンツに限定されません。PHP 動的ページやその他の動的に生成されたコンテンツは、他のパフォーマンス調整メカニズムや対応するサーバー側のキャッシュ ルールと併用することで圧縮でき、パフォーマンスを大幅に向上させることができます。ウェブサイトのパフォーマンス。したがって、Linux サーバーにデプロイされた PHP プログラムの場合は、サーバーがサポートしている場合は Gzip Web 圧縮を有効にすることをお勧めします。

2. Web サーバーが HTTP 圧縮を処理するプロセスは次のとおりです。 1. Web サーバーはブラウザから HTTP リクエストを受信した後、ブラウザが HTTP 圧縮 (Accept-Encoding 情報) をサポートしているかどうかを確認します。

2. ブラウザが HTTP 圧縮をサポートしている場合、Web サーバーは要求されたファイルのサフィックスをチェックします。

3. リクエストされたファイルが HTML、CSS などの静的ファイルの場合、Web サーバーはリクエストされたファイルの最新の圧縮ファイルが圧縮バッファ ディレクトリに既に存在するかどうかを確認します。

4. 要求されたファイルの圧縮ファイルが存在しない場合、Web サーバーは圧縮されていない要求されたファイルをブラウザに返し、要求されたファイルの圧縮ファイルを圧縮バッファ ディレクトリに保存します。

5. 要求されたファイルの最新の圧縮ファイルが既に存在する場合、要求されたファイルの圧縮ファイルが直接返されます。

6. 要求されたファイルが動的ファイルの場合、Web サーバーはコンテンツを動的に圧縮し、ブラウザに返します。圧縮されたコンテンツは圧縮キャッシュ ディレクトリに保存されません。

ここに 2 つのデモンストレーション写真があります:

Gzip をオンにした後:


3. Apacheのgzip機能を有効にする

Apache には、圧縮に Gzip 圧縮アルゴリズムを使用する 2 つのモジュールがあります:

mod_gzip と mod_deflate

。 Gzip Web 圧縮を使用するには、まずサーバーがこれら 2 つのコンポーネントのいずれかをサポートしていることを確認してください。

Gzip を使用するにはクライアント ブラウザのサポートも必要ですが、現在、IE、Mozilla Firefox、Opera、Chrome など、ほとんどのブラウザが Gzip をサポートしていますので、ご安心ください。


HTTP ヘッダーを調べることで、使用されているクライアント ブラウザーが gzip 圧縮をサポートしているかどうかをすぐに判断できます。送信された HTTP ヘッダーに次の情報が表示される場合は、ブラウザーが対応する gzip 圧縮をサポートしていることを意味します:

コードをコピーします コードは次のとおりです:

Accept-Encoding: gzip は mod_gzip をサポートします
Accept-Encoding: deflate は mod_deflate をサポートします

Accept-Encoding: gzip,deflate は mod_gzip と mod_deflate の両方をサポートします

firebug として表示:

Accept-Encoding: gzip,deflate は mod_gzip と mod_deflate の両方をサポートします


サーバーが Gzip コンポーネントのサポートを有効にしている場合は、http.conf または .htaccess でカスタマイズできます。 .htaccess 構成の簡単な例を次に示します。

mod_gzip 設定:

コードをコピーします コードは次のとおりです:
# mod_gzip:

mod_gzip _on はい
mod _gzip_dechunk はい
mod_gzip_item_include ファイル .(html ?|txt| js|php|pl)$
mod_gzip_item_include ハンドラー ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude r spheader ^Content-Encoding:. *gzip.*



mod_deflate 設定例:

開くApache設定ファイルhttpd.confを開きます

#LoadModule deflate_module modules/mod_deflate.so の先頭の ## を削除します

コードをコピーします コードは次のとおりです:
# mod_deflate:
DeflateCompression レベル 6 #圧縮率、6 は推奨値です。
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
Add OutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/ xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
追加OutputFilterByType DEFLATE 画像/svg+xml
< ;/ifモジュール>
里面的文件MIME类型可以根据自己情况添加,至于PDF 、图片、音乐文档之类的这些本身都已经高度压缩格式,重复压缩的作用不大,反而可能会因为增加CPU的处理时间及浏览器的渲染问题而降低性能。所以就没必要再通过Gzip压缩。通过以上设置后再查看返回的HTTP头,出现以下信息则表明返回的数据已经过压缩。即网站程序所配置的Gzip压缩已生效。
Content-Encoding: gzip

firebug查看:


注意:

1)不管使用mod_gzip 还是mod_deflate,此处返回的信息都一样。因为它们都是实现的gzip压缩方式。

2)CompressionLevel 9是指压缩程度的等级(设置压缩比率),取值范围在从1到9,9是最高等级。据了解,这样做最高可以减少8成大小的传输量(看档案内容而定),最少也能够节省一半。 CompressionLevel 预设可以采用 6 这个数值,以维持耗用处理器效能与网页压缩质量的平衡. 不建议设置太高,如果设置很高,虽然有很高的压缩率,但是占用更多的CPU资源.
3) 对已经是压缩过的图片格式如jpg,音乐档案如mp3、压缩文件如zip之类的,就没必要再压缩了。

四、mod_gzip 和mod_deflate的主要区别是什么?使用哪个更好呢?

       第一个区别是安装它们的Apache Web服务器版本的差异

       Apache 1.x系列没有内建网页压缩技术,所以才去用额外的第三方mod_gzip 模块来执行压缩。而Apache 2.x官方在开发的时候,就把网页压缩考虑进去,内建了mod_deflate 这个模块,用以取代mod_gzip。虽然两者都是使用的Gzip压缩算法,它们的运作原理是类似的。

       第二个区别是压缩质量

       mod_deflate 压缩速度略快而mod_gzip 的压缩比略高。一般默认情况下,mod_gzip 会比mod_deflate 多出4%~6%的压缩量。

       那么,为什么使用mod_deflate?

       第三个区别是对服务器资源的占用

       一般来说mod_gzip 对服务器CPU的占用要高一些。mod_deflate 是专门为确保服务器的性能而使用的一个压缩模块,mod_deflate 需要较少的资源来压缩文件。这意味着在高流量的服务器,使用mod_deflate 可能会比mod_gzip 加载速度更快。

      不太明白?简而言之,如果你的网站,每天不到1000独立访客,想要加快网页的加载速度,就使用mod_gzip。虽然会额外耗费一些服务器资源, 但也是值得的。如果你的网站每天超过1000独立访客,并且使用的是共享的虚拟主机,所分配系统资源有限的话,使用mod_deflate 将会是更好的选择。

     另外,从Apache 2.0.45开始,mod_deflate 可使用DeflateCompressionLevel 指令来设置压缩级别。该指令的值可为1(压缩速度最快,最低的压缩质量)至9(最慢的压缩速度,压缩率最高)之间的整数,其默认值为6(压缩速度和压缩质 量较为平衡的值)。这个简单的变化更是使得mod_deflate 可以轻松媲美mod_gzip 的压缩。

P.S. 对于没有启用以上两种Gzip模块的虚拟空间,还可以退而求其次使用php的zlib函数库(同样需要查看服务器是否支持)来压缩文件,只是这种方法使用起来比较麻烦,而且一般会比较耗费服务器资源,请根据情况慎重使用。

五、zlib.output_compression和ob_gzhandler编码方式压缩

      服务器不支持mod_gzip、mod_deflate模块,若想通过GZIP压缩网页内容,可以考虑两种方式,开启zlib.output_compression或者通过ob_gzhandler编码的方式

      1)zlib.output_compression是在对网页内容压缩的同时发送数据至客户端。

2) ob_gzhandler は、Web ページのコンテンツが圧縮されるのを待ってから送信します。比較すると、前者の方が効率的ですが、2 つは同時に使用できないことに注意してください。選択できるのは 1 つだけです。エラーが発生します。

做 2 つの実装方法を簡単に説明します:

1. zlib.output_compression の実装
zlib ライブラリの使用

’ out out out out out out Through off

through through through through through to through through through through through through through through through - - through -w - スタンドアロン、または特定のバッファーへサイズ
; 圧縮に使用されます (デフォルトは 4KB)

; 圧縮の性質により、結果として得られるチャンク サイズは異なる場合があります ; ; パフォーマンスを向上させるには、チャンク サイズを大きくしてください。さらに、output_buffering を有効にします。そうしないと、出力が破損します。 /zlib.output-compression zlib.output_compression = Off
; http://php.net/zlib.output-compression-level
;zlib.output_compression_level = -1


必要に応じて、php.ini ファイルを編集し、次の内容を追加します:



コードをコピーします

コードは次のとおりです:


zlib.output_compression = On
zlib.output_compression_level = 6

phpinfo() 関数を通じて結果を確認できます。

zlib.output_compression の Local Value と MasterValue が両方とも On の場合、この時点でアクセスした PHP ページ (擬似静的ページを含む) が GZIP 圧縮されていることを意味します。これは Firebug または によって検出できます。オンライン Web ページ GZIP 圧縮検出ツール 圧縮効果。
2. ob_gzhandler の実装方法 ob_gzhandler を使用する必要がある場合は、zlib.output_compression をオフにして、php.ini ファイルの内容を次のように変更する必要があります。
zlib.output_compression = Off
zlib.output_compression_level = -1
関連するコードを挿入して GZIP 圧縮を実装するPHP ファイル:


コードをコピー

コードは次のとおりです:
if (extension_loaded('zlib')) {

if ( !headers_sent() AND isset($_SERVER['HTTP_ACCEPT_ENCODING']) &&

strpos($_SERVER[' HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)
// ページには出力がなく、ブラウザは GZIP を受け入れることができます
//圧縮されるコンテンツ
echo $context
ob_end_flush( );
zlib.output_compression であっても ob_gzhandler であっても、HTML、CSS、JS などの静的ファイルに対して GZIP 圧縮を実行できるのは、PHP を呼び出すことによってのみです。

最後に言いたいのは、現在の主流のブラウザはデフォルトで HTTP1.1 プロトコルを使用しており、IE の場合は、メニュー バー ツール - [インターネット オプション] - [詳細] - を選択しない場合、基本的に GZIP 圧縮をサポートしているということです。 HTTP 1.1 設定 -> HTTP 1.1 を使用すると、Web ページ圧縮後の速度向上による喜びを感じることができなくなります。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/326942.html技術記事 1. gzip の概要 gzip は GNU zip の略称で、GNU フリー ソフトウェアのファイル圧縮プログラムであり、ファイル形式 gzip を表すためによく使用されます。ソフトウェアの作者は Jean-loup Gailly と Mar...

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。