第四章:压缩组件 —《高性能网站建设指南》读书笔记
此项优化从服务端入手,采用压缩算法,可以有效的减少网络传输量。服务端对需要传输的组件进行压缩,客户端接收到数据后,采用和服务端一致的算法进行解压缩。实现过程大致如下:
1. 浏览器发送的请求头中包含Accept-Encoding,指定客户端支持的所有压缩格式,如:
Accept-Encoding: gzip, deflate
2. 服务器接收请求头,选择请求头中的一种压缩算法对内容进行压缩,并在发送给客户端的响应头中,声明采用的压缩格式,如:
Content-Encoding: gzip
3. 客户端接收到响应数据后,使用响应头中指定的压缩算法对数据进行解压缩。
此即客户端和服务端协商使用压缩算法的过程。
在压缩算法的选择上,大多数都选择gzip,支持deflate的浏览器也支持gzip,反之则不行。如msn.com则采用deflate算法进行压缩,可抓包验证。
若使用程序模拟浏览器获取数据,且设置了Accept-Encoding的话,则需要对服务端返回的代码使用相应算法进行解压缩,否则是乱码,无法正常显示。PHP测试代码:
$opts = array( 'http' => array( 'method' => 'GET', /* 可注释下面语句进行调试、抓包 */ 'header' => 'Accept-Encoding: gzip,deflate', ) ); $context = stream_context_create($opts); $data = file_get_contents('http://www.baidu.com/', false, $context); print_r($data);
在HTTP1.1(rfc2616)中,定义了三种内容编码格式(Content Codings),即压缩算法:gzip、compress和deflate,但大多数浏览器只支持gzip和deflate。在实际使用中,还有其他压缩格式,如目前Google Chrome支持sdch,不再支持bzip2。
gzip是基于deflate算法的封装,deflate代表的是zlib stream,这里可以看到两者的区别。两者的详细介绍可以看Wiki:
Image和pdf等本身已经压缩的文件不用再次压缩,免得浪费服务器资源。