?
This document uses PHP Chinese website manual Release
壓縮是提高網(wǎng)站性能的重要方法。對于某些文檔,最多可減少70%的尺寸可降低帶寬容量需求。多年來,算法也變得更加高效,并且新的算法得到了客戶端和服務(wù)器的支持。
在實(shí)踐中,Web開發(fā)人員不需要實(shí)現(xiàn)壓縮機(jī)制,瀏覽器和服務(wù)器都已經(jīng)實(shí)現(xiàn)了壓縮機(jī)制,但他們必須確保服務(wù)器配置充分。壓縮發(fā)生在三個(gè)不同的級別:
首先一些文件格式是用特定的優(yōu)化方法壓縮的,
那么通用加密可以在HTTP級別發(fā)生(資源從頭到尾被壓縮傳輸),
最后可以在HTTP連接的兩個(gè)節(jié)點(diǎn)之間的連接級別定義壓縮。
每種數(shù)據(jù)類型都有一些冗余,那就是浪費(fèi)的空間。如果文本通常具有高達(dá)60%的冗余度,那么對于音頻和視頻等其他媒體,此速率可能會更高。與文本不同,這些其他媒體類型正在占用大量空間來存儲,并且需要重新獲得這種浪費(fèi)的空間顯得非常早。工程師設(shè)計(jì)了針對特定用途設(shè)計(jì)的文件格式所使用的優(yōu)化壓縮算法。用于文件的壓縮算法可以分為兩大類:
無損壓縮,其中壓縮 - 解壓縮循環(huán)不會改變恢復(fù)的數(shù)據(jù)。它匹配(字節(jié)到字節(jié))與原始。對于圖像gif
或png
使用無損壓縮。
有損壓縮是循環(huán)改變原始數(shù)據(jù)的地方,對用戶來說是不可感知的。
Web上的視頻格式是有損和面向圖像的,如jpeg
。
有些格式可以用于無損壓縮或有損壓縮,如webp
通常有損算法可以配置為壓縮或多或少,這當(dāng)然會導(dǎo)致更少或更多的質(zhì)量。為了獲得更好的網(wǎng)站性能,在保持可接受的質(zhì)量水平的同時(shí)盡可能進(jìn)行壓縮是理想的選擇。對于圖像來說,由工具生成的圖像可能無法針對Web進(jìn)行優(yōu)化; 建議使用能夠以所需質(zhì)量盡可能壓縮的工具。有很多專門為此設(shè)計(jì)的工具。
有損壓縮算法通常比無損壓縮算法更高效。
由于壓縮對特定類型的文件效果更好,通常不會再次壓縮它們。事實(shí)上,由于開銷的成本(算法通常需要一個(gè)增加初始大小的字典)可能會高于額外的壓縮增益,導(dǎo)致文件較大,因此這往往是反效果的。不要將以下兩種技術(shù)用于壓縮格式的文件。
對于壓縮,端到端壓縮是網(wǎng)站最大的性能改進(jìn)所在。端到端壓縮指的是壓縮由服務(wù)器完成的消息主體,并在到達(dá)客戶端之前保持不變。無論中間節(jié)點(diǎn)是什么,它們都不會影響身體。
所有現(xiàn)代瀏覽器和服務(wù)器都支持它,唯一需要協(xié)商的是要使用的壓縮算法。這些算法針對文本進(jìn)行了優(yōu)化。在20世紀(jì)90年代,壓縮技術(shù)正在快速發(fā)展,許多連續(xù)的算法已被添加到可能的選擇集中。目前,只有兩個(gè)是相關(guān)的:gzip
最常見的和br
新的挑戰(zhàn)者。
要選擇要使用的算法,瀏覽器和服務(wù)器使用主動(dòng)內(nèi)容協(xié)商。瀏覽Accept-Encoding
器用它支持的算法和它的優(yōu)先順序發(fā)送一個(gè)標(biāo)題,服務(wù)器選擇一個(gè),用它壓縮響應(yīng)的主體,并使用Content-Encoding
標(biāo)題告訴瀏覽器它選擇的算法。由于內(nèi)容協(xié)商已經(jīng)被用來根據(jù)編碼來選擇一個(gè)表示,所以在響應(yīng)Vary
中至少包含一個(gè)包含Content-Encoding
這個(gè)標(biāo)題的報(bào)頭; 這樣,緩存將能夠緩存資源的不同表示。
由于壓縮帶來顯著的性能改進(jìn),建議將其激活為所有文件,但已經(jīng)壓縮的文件如圖像,音頻文件和視頻。
Apache支持壓縮并使用mod_deflate ; 對于nginx有ngx_http_gzip_module ; 對于IIS,<httpCompression>
元素。
逐跳壓縮盡管與端到端壓縮類似,但其差異在于一個(gè)基本要素:壓縮不會發(fā)生在服務(wù)器的資源中,從而創(chuàng)建一個(gè)特定的表示,然后傳輸,但是在客戶端和服務(wù)器之間的路徑上的任何兩個(gè)節(jié)點(diǎn)之間的消息。連續(xù)的中間節(jié)點(diǎn)之間的連接可以應(yīng)用不同的壓縮。
為此,HTTP使用類似于內(nèi)容協(xié)商的機(jī)制進(jìn)行端對端壓縮:發(fā)送請求的節(jié)點(diǎn)使用TE
標(biāo)頭通知它的意愿,而另一節(jié)點(diǎn)選擇適當(dāng)?shù)姆椒?,?yīng)用它并指示它的選擇Transfer-Encoding
頭。
實(shí)際上,逐跳壓縮對于服務(wù)器和客戶端是透明的,并且很少使用。TE
并且Transfer-Encoding
主要用于通過塊發(fā)送響應(yīng),從而允許在不知道其長度的情況下開始傳輸資源。
請注意,Transfer-Encoding
在跳躍層使用和壓縮非常罕見,大多數(shù)服務(wù)器(如Apache,nginx或IIS)都沒有簡單的方法來配置它。這種配置通常發(fā)生在代理級別。