gzip是GNU zip的縮寫,它是一個GNU自由軟件的文件壓縮程序,也經(jīng)常用來表示gzip這種文件格式。軟件的作者是Jean-loup Gailly和Mark Adler。1992年10月31日第一次公開發(fā)布,版本號是0.1,目前的穩(wěn)定版本是1.2.4。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的施秉網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!Gzip主要用于Unix系統(tǒng)的文件壓縮。我們在linux中經(jīng)常會用到后綴為.gz的文件,它們就是GZIP格式的?,F(xiàn)今已經(jīng)成為Internet 上使用非常普遍的一種數(shù)據(jù)壓縮格式,或者說一種文件格式。 當(dāng)應(yīng)用Gzip壓縮到一個純文本文件時,效果是非常明顯的,經(jīng)過GZIP壓縮后頁面大小可以變?yōu)樵瓉淼?0%甚至更小,這取決于文件中的內(nèi)容。
HTTP協(xié)議上的GZIP編碼是一種用來改進(jìn)WEB應(yīng)用程序性能的技術(shù)。web開發(fā)中可以通過gzip壓縮頁面來降低網(wǎng)站的流量,而gzip并不會對cpu造成大量的占用,略微上升,也是幾個百分點而已,但是對于頁面卻能壓縮30%以上,非常劃算。
利用Apache中的Gzip模塊,我們可以使用Gzip壓縮算法來對Apache服務(wù)器發(fā)布的網(wǎng)頁內(nèi)容進(jìn)行壓縮后再傳輸?shù)娇蛻舳藶g覽器。這樣經(jīng)過壓縮后實際上降低了網(wǎng)絡(luò)傳輸?shù)淖止?jié)數(shù)(節(jié)約傳輸?shù)木W(wǎng)絡(luò)I/o),最明顯的好處就是可以加快網(wǎng)頁加載的速度。
網(wǎng)頁加載速度加快的好處不言而喻,除了節(jié)省流量,改善用戶的瀏覽體驗外,另一個潛在的好處是Gzip與搜索引擎的抓取工具有著更好的關(guān)系。例如 Google就可以通過直接讀取gzip文件來比普通手工抓取更快地檢索網(wǎng)頁。在Google網(wǎng)站管理員工具(Google Webmaster Tools)中你可以看到,sitemap.xml.gz 是直接作為Sitemap被提交的。
而這些好處并不僅僅限于靜態(tài)內(nèi)容,php動態(tài)頁面和其他動態(tài)生成的內(nèi)容均可以通過使用Apache壓縮模塊壓縮,加上其他的性能調(diào)整機(jī)制和相應(yīng)的服務(wù)器端 緩存規(guī)則,這可以大大提高網(wǎng)站的性能。因此,對于部署在Linux服務(wù)器上的PHP程序,在服務(wù)器支持的情況下,我們建議你開啟使用Gzip Web壓縮。
二、Web服務(wù)器處理HTTP壓縮的過程如下: Web服務(wù)器接收到瀏覽器的HTTP請求后,檢查瀏覽器是否支持HTTP壓縮(Accept-Encoding 信息); 如果瀏覽器支持HTTP壓縮,Web服務(wù)器檢查請求文件的后綴名; 如果請求文件是HTML、CSS等靜態(tài)文件,Web服務(wù)器到壓縮緩沖目錄中檢查是否已經(jīng)存在請求文件的最新壓縮文件; 如果請求文件的壓縮文件不存在,Web服務(wù)器向瀏覽器返回未壓縮的請求文件,并在壓縮緩沖目錄中存放請求文件的壓縮文件; 如果請求文件的最新壓縮文件已經(jīng)存在,則直接返回請求文件的壓縮文件; 如果請求文件是動態(tài)文件,Web服務(wù)器動態(tài)壓縮內(nèi)容并返回瀏覽器,壓縮內(nèi)容不存放到壓縮緩存目錄中。 三、啟用apache的gzip功能Apache上利用Gzip壓縮算法進(jìn)行壓縮的模塊有兩種:mod_gzip 和mod_deflate。要使用Gzip Web壓縮,請首先確定你的服務(wù)器開啟了對這兩個組件之一的支持。
雖然使用Gzip同時也需要客戶端瀏覽器的支持,不過不用擔(dān)心,目前大部分瀏覽器都已經(jīng)支持Gzip了,如IE、Mozilla Firefox、Opera、Chrome等。
通過查看HTTP頭,我們可以快速判斷使用的客戶端瀏覽器是否支持接受gzip壓縮。若發(fā)送的HTTP頭中出現(xiàn)以下信息,則表明你的瀏覽器支持接受相應(yīng)的gzip壓縮:
代碼如下:
Accept-Encoding: gzip 支持mod_gzip Accept-Encoding: deflate 支持mod_deflate Accept-Encoding: gzip,deflate 同時支持mod_gzip 和mod_deflate
如firebug查看:
如果服務(wù)器開啟了對Gzip組件的支持,那么我們就可以在http.conf或.htaccess里面進(jìn)行定制。
mod_gzip 的配置:下面是一個.htaccess配置的簡單實例:
# mod_gzip: <ifModule mod_gzip.c> mod_gzip_on Yes mod_gzip_dechunk Yes mod_gzip_item_include file .(html?|txt|css|js|php|pl)$ mod_gzip_item_include handler ^cgi-script$ mod_gzip_item_include mime ^text/.* mod_gzip_item_include mime ^application/x-javascript.* mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* <ifModule>
mod_deflate的配置實例:
打開apache 配置文件httpd.conf
去除開頭的#號
#LoadModule deflate_module modules/mod_deflate.so #LoadModule headers_module modules/mod_headers.so #LoadModule filter_module modules/mod_filter.so
增加代碼如下:
<IfModule deflate_module> #必須的,就像一個開關(guān)一樣,告訴apache對傳輸?shù)綖g覽器的內(nèi)容進(jìn)行壓縮 SetOutputFilter DEFLATE #壓縮級別,1-9,9為高 DeflateCompressionLevel 6 #不進(jìn)行壓縮的文件 SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary #設(shè)置不對后綴gif,jpg,jpeg,png的圖片文件進(jìn)行壓縮 SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary #同上,就是設(shè)置不對exe,tgz,gz。。。的文件進(jìn)行壓縮 SetEnvIfNoCase Request_URI .(?:pdf|doc|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary #壓縮的文件 AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-httpd-php application/x-javascript AddOutputFilterByType DEFLATE js css AddOutputFilterByType INCLUDES .shtml .htm .xml .php .html #針對代理服務(wù)器的設(shè)置 <IfModule headers_moudle> Header append vary User-Agent </IfModule> </IfModule>
里面的文件MIME類型可以根據(jù)自己情況添加,至于PDF、圖片、音樂文檔之類的這些本身都已經(jīng)高度壓縮格式,重復(fù)壓縮的作用不大,反而可能會因為增加CPU的處理時間及瀏覽器的渲染問題而降低性能。所以就沒必要再通過Gzip壓縮。通過以上設(shè)置后再查看返回的HTTP頭,出現(xiàn)以下信息則表明返回的數(shù)據(jù)已經(jīng)過壓縮。即網(wǎng)站程序所配置的Gzip壓縮已生效。
Content-Encoding: gzip
注意:
不管使用mod_gzip 還是mod_deflate,此處返回的信息都一樣。因為它們都是實現(xiàn)的gzip壓縮方式。 CompressionLevel 9是指壓縮程度的等級(設(shè)置壓縮比率),取值范圍在從1到9,9是高等級。據(jù)了解,這樣做高可以減少8成大小的傳輸量(看檔案內(nèi)容而定),最少也能夠 節(jié)省一半。 CompressionLevel 預(yù)設(shè)可以采用 6 這個數(shù)值,以維持耗用處理器效能與網(wǎng)頁壓縮質(zhì)量的平衡. 不建議設(shè)置太高,如果設(shè)置很高,雖然有很高的壓縮率,但是占用更多的CPU資源. 對已經(jīng)是壓縮過的圖片格式如jpg,音樂檔案如mp3、壓縮文件如zip之類的,就沒必要再壓縮了。 四、mod_gzip 和mod_deflate的主要區(qū)別是什么?使用哪個更好呢? 第一個區(qū)別是安裝它們的Apache Web服務(wù)器版本的差異:Apache 1.x系列沒有內(nèi)建網(wǎng)頁壓縮技術(shù),所以才去用額外的第三方mod_gzip 模塊來執(zhí)行壓縮。而Apache 2.x官方在開發(fā)的時候,就把網(wǎng)頁壓縮考慮進(jìn)去,內(nèi)建了mod_deflate 這個模塊,用以取代mod_gzip。雖然兩者都是使用的Gzip壓縮算法,它們的運作原理是類似的。
第二個區(qū)別是壓縮質(zhì)量:mod_deflate 壓縮速度略快而mod_gzip 的壓縮比略高。一般默認(rèn)情況下,mod_gzip 會比mod_deflate 多出4%~6%的壓縮量。 那么,為什么使用mod_deflate?
第三個區(qū)別是對服務(wù)器資源的占用:一般來說mod_gzip 對服務(wù)器CPU的占用要高一些。mod_deflate 是專門為確保服務(wù)器的性能而使用的一個壓縮模塊,mod_deflate 需要較少的資源來壓縮文件。這意味著在高流量的服務(wù)器,使用mod_deflate 可能會比mod_gzip 加載速度更快。
不太明白?簡而言之,如果你的網(wǎng)站,每天不到1000獨立訪客,想要加快網(wǎng)頁的加載速度,就使用mod_gzip。雖然會額外耗費一些服務(wù)器資源, 但也是值得的。如果你的網(wǎng)站每天超過1000獨立訪客,并且使用的是共享的虛擬主機(jī),所分配系統(tǒng)資源有限的話,使用mod_deflate 將會是更好的選擇。
另外,從Apache 2.0.45開始,mod_deflate 可使用DeflateCompressionLevel 指令來設(shè)置壓縮級別。該指令的值可為1(壓縮速度最快,低的壓縮質(zhì)量)至9(最慢的壓縮速度,壓縮率高)之間的整數(shù),其默認(rèn)值為6(壓縮速度和壓縮質(zhì) 量較為平衡的值)。這個簡單的變化更是使得mod_deflate 可以輕松媲美m(xù)od_gzip 的壓縮。
P.S. 對于沒有啟用以上兩種Gzip模塊的虛擬空間,還可以退而求其次使用php的zlib函數(shù)庫(同樣需要查看服務(wù)器是否支持)來壓縮文件,只是這種方法使用起來比較麻煩,而且一般會比較耗費服務(wù)器資源,請根據(jù)情況慎重使用。 五、zlib.output_compression和ob_gzhandler編碼方式壓縮服務(wù)器不支持mod_gzip、mod_deflate模塊,若想通過GZIP壓縮網(wǎng)頁內(nèi)容,可以考慮兩種方式,開啟zlib.output_compression或者通過ob_gzhandler編碼的方式。
1)zlib.output_compression是在對網(wǎng)頁內(nèi)容壓縮的同時發(fā)送數(shù)據(jù)至客戶端。
2)ob_gzhandler是等待網(wǎng)頁內(nèi)容壓縮完畢后才進(jìn)行發(fā)送,相比之下前者效率更高,但需要注意的是,兩者不能同時使用,只能選其一,否則將出現(xiàn)錯誤。
兩者的實現(xiàn)方式做簡單描述:
1. zlib.output_compression實現(xiàn)方式
在默認(rèn)情況下,zlib.output_compression是關(guān)閉:
代碼如下:
; Transparent output compression using the zlib library ; Valid values for this option are \'off\', \'on\', or a specific buffer size ; to be used for compression (default is 4KB) ; Note: Resulting chunk size may vary due to nature of compression. PHP ; outputs chunks that are few hundreds bytes each as a result of ; compression. If you prefer a larger chunk size for better ; performance, enable output_buffering in addition. ; Note: You need to use zlib.output_handler instead of the standard ; output_handler, or otherwise the output will be corrupted. ; http://php.net/zlib.output-compression zlib.output_compression = Off ; http://php.net/zlib.output-compression-level ;zlib.output_compression_level = -1
如需開啟需編輯php.ini文件,加入以下內(nèi)容:
代碼如下:
zlib.output_compression = On zlib.output_compression_level = 6
可以通過phpinfo()函數(shù)檢測結(jié)果。 當(dāng)zlib.output_compression的Local Value和MasterValue的值同為On時,表示已經(jīng)生效,這時候訪問的PHP頁面(包括偽靜態(tài)頁面)已經(jīng)GZIP壓縮了,通過Firebug或 者在線網(wǎng)頁GZIP壓縮檢測工具可檢測到壓縮的效果。
2. ob_gzhandler的實現(xiàn)方式
如果需要使用ob_gzhandler,則需關(guān)閉zlib.output_compression,把php.ini文件內(nèi)容更改為:
zlib.output_compression = Off zlib.output_compression_level = -1
通過在PHP文件中插入相關(guān)代碼實現(xiàn)GZIP壓縮P壓縮:
代碼如下:
if (extension_loaded(\'zlib\')) { if ( !headers_sent() AND isset($_SERVER[\'HTTP_ACCEPT_ENCODING\']) && strpos($_SERVER[\'HTTP_ACCEPT_ENCODING\'], \'gzip\') !== FALSE) //頁面沒有輸出且瀏覽器可以接受GZIP的頁面 { ob_start(\'ob_gzhandler\'); } } //待壓縮的內(nèi)容 echo $context; ob_end_flush();
不管是zlib.output_compression還是ob_gzhandler,都僅能對PHP文件進(jìn)行GZIP壓縮,對于HTML、CSS、JS等靜態(tài)文件只能通過調(diào)用PHP的方式實現(xiàn)。
最后想說的是,現(xiàn)在主流的瀏覽器默認(rèn)使用的是HTTP1.1協(xié)議,基本都支持GZIP壓縮,對于IE而言,假如你沒有選中其菜單欄工具-》Internet 選項-》高級-》HTTP 1.1 設(shè)置-》使用 HTTP1.1,那么,你將感受不到網(wǎng)頁壓縮后的速度提升所帶來的快感!
標(biāo)題名稱:Apache&PHP的gzip壓縮輸出的實現(xiàn)方法
網(wǎng)站路徑:http://www.rwnh.cn/article48/cgijep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、云服務(wù)器、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)