藏井阁

" Scientists ask why, engineers ask why not? "

第四章:压缩组件 —《高性能网站建设指南》读书笔记

此项优化从服务端入手,采用压缩算法,可以有效的减少网络传输量。服务端对需要传输的组件进行压缩,客户端接收到数据后,采用和服务端一致的算法进行解压缩。实现过程大致如下:

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等本身已经压缩的文件不用再次压缩,免得浪费服务器资源。

类别: Web开发

Tags:

damon pang

大魔

Damo

i#impng.com

专注Web开发,爱电影,爱One Piece.