前文引入伺服器端快取解決效能,但衍生硬碟空間與流量暴增問題:70 萬頁面、日均 3 萬 PV,首日產生 300MB 快取,10 天達 2GB 導致主機商關站;月流量第 8 天即達 20GB(限額 50GB)。
GZIP 將文字內容壓縮至原始 20% 左右,主流瀏覽器皆支援。關鍵創新:快寫入時直接壓縮存儲,讀取時視瀏覽器支援度直接傳送或解壓回傳,零 CPU 壓縮開銷,反而提升效能。
判斷瀏覽器支援: 檢查 Request Header Accept-Encoding: gzip, deflate。
回應標記: 支援時回應 Header Content-Encoding: gzip。
快寫入(壓縮存儲):
FileStream fileStream = File.Create(path);
Stream writer = new GZipOutputStream(fileStream);
XsltArgumentList list = new XsltArgumentList();
xslt.Transform(xml, list, writer, null);
writer.Close(); fileStream.Close();
快讀取(智能回傳):
if (acceptEncoding != null && acceptEncoding.IndexOf("gzip") >= 0) {
Response.AddHeader("Content-Encoding", "gzip");
Response.TransmitFile(path); // 直接傳送壓縮檔
} else {
Stream reader = new GZipInputStream(File.OpenRead(path));
byte[] buffer = new byte[1024];
int p;
while ((p = reader.Read(buffer, 0, 1024)) > 0) {
Response.OutputStream.Write(buffer, 0, p);
Response.Flush();
}
}
百利而無一害的優化策略。