Day47

HTTP 协议缓存控制

我们观察图片的下载,往往

第1次请求时200OK

第2次请求时304Not Modified未修改状态

解释:在网络上有一些缓存服务器,浏览器自身也有缓存功能

当我们第一次某图片时,正常下载图片.返回值200

基于一个前提–图片不会经常改动,服务器在返回200的同时,返回该图片的“签名”–Etag,(签名可以理解图片的“指纹”)

当浏览再次访问该图片时,去服务器校验“指纹”

如果图片没有发变化,直接使用缓存里的图片,这样减轻了服务器的负担

抓包观察:

第一次请求头:

没有太大变化

就简单的GET方法

第一次响应头 :

Etag:就相当于文件的指纹

Last Modified:上次修改的时间

第二次请求头:

If-Modified-Since If-None-Match

这两行的意思是:

如果自“Tue,18Jun 2020 10 9:44:55 GMT“这个时间点以后,图片修改过,则重新请求

如果该图片最新的Etag的值和If-None-Match的值不匹配,则重新请求

第二次响应头:

如果是304,就意味着浏览器从本地取缓存,节省了图片在我网络上传输的时间

选学:

HTTP协议与缓存控制

如果网站比较大,有N台缓存服务器,那么这N台缓存服务器如何处理服务器上的文件。

  1. 要不要缓存
  2. 缓存多久?

思考–这说明缓存服务器与主服务器之间,应该有一些协议来说明这2个问题?

追问—用什么协议来说明这2个问题

答:还是用http协议 用头信息 cache-control来控制

利用协议控制缓存

相关模块:mod_expires

具体用法:

在主服务器,打开apache的expires扩展,利用该扩展来控制图片,css,html等文件

控制是否缓存及缓存生命周期

在htaccess中,具体语法如下:

ExpiresDefault“ [plus] { }* ”

ExpiresByType type/encoding “ [plus] { }* ”

ExpiresDefault是设置默认的缓存参数

ExpiresByType是按照文件类型来设置独特的缓存参数

我们用第2种来做测试给jpg图片设置1个月的生存周期

后4个参数怎么理解?

Base:基于哪个时间点来计算缓存有效期

Access/now:基于请求响应的那一瞬间。比如从此瞬间到1个月后

Modifiacation:基于被请求文件的最后修改日期来计算.比如 最后修改日期的后1周内仍然有效

Num:缓存时间的大小(30)

Type:缓存时间的单位(天)

ExpiresActive On
ExpiresByType image/jepg "access plus 30 days"

如果这是在集群环境里,缓存服务器得到此图片,将会认为一个月内有效

减轻了主服务器的负担

我们是否可以设置服务器没有缓存呢?

比如有些个人信息,不允许缓存服务器缓存,必须到主服务器去请求

Control-cache:no-store,must-revalidate;//这意味着不允许缓存,必须要去主服务器验证

可以利用apache的header模块

<FileMatch “.(gif)$”>过滤,如果是gif图执行下面的不进行缓存

header set Cache-control “no-store,must-revalidate”

ExpiresActive On
ExpiresByType image/jepg "access plus 30 days"
<FileMatch "\.(gif)$">
header set Cache-control "no-store,must-revalidate"
</FileMatch>

多次刷新页面发现gif不允许缓存,每次都重新请求 返回200OK

其他类型的可能返回304

HTTP协议与内容压缩

观察 我们打开163的一篇新闻

看到响应头信息

注意:Content-Length:36187

同时我们右键保存其源码,得到的文本文件的大小:136248 字节

思考:Content-Length的之前的学习中,我们知道,代表返回的主体的长度

但此处为什么返回的主体长度和Content-Length不一致呢?

原因在于:Content-Encoding:gzip这个响应头信息的作用

原理:为了加快网页在网络上的传输速度,服务器对主体信息进行压缩

如常见的gzip压缩,deflate压缩以及google chrome正在推得sdch压缩

压缩的过程:服务器返回压缩内容,客户端接收到压缩再解压缩再渲染页面

刚才的那个情况的原因----服务器对页面进行了压缩 content-length是压缩后的长度

如何在apache启用压缩功能?

利用编码压缩提高性能

  1. 开启deflate模块或gzip模块

  2. 在conf文件中写如下代码

    <ifmodule mod deflate.c>
    
    DeflateCompressionLevel 6 //压缩级别为6,可选1-9,推荐为6
    AddOutputFileByType DEFLATE text/plain//压缩文本文件    
    AddOutputFileByType DEFLATE text/html//压缩html文件
    AddOutputFileByType DEFLATE text/xml  //压缩xml文件 
    </ifmodule>

    为什么要指定文件类型进行压缩?

    答:压缩也是要耗CPU资源的,图片、视频等文件,压缩效果也不好.

    一般压缩文本格式

    问:服务器怎么知道我们的浏览器支持gzip的?

    答:例如: Accep-Ecoding:gzip,deflate,sdch

    客户端允许发一个 Accep-Ecoding头信息,与服务器协商

    这个例子可以看出,chrome浏览器支持gzip,deflate,sdch 3种压缩方式

小技巧:当我们在采集时,可以不发送Accept-Encoding信息,这样采集直接是源码

当然也可以采集gzip(提高速度),再用票PHP解压gzip的内容.

HTTP协议与持久链接+分块链接---->反向ajax

反向ajax又叫comet,server,push服务器技术

应用范围:网页聊天服务器,新浪微博在线聊天 google mail网页聊天都有用到

原理:一般而言,HTTP协议的特点,链接<–>断开

具体什么时间断开?

服务器响应content-length,收到指定的length长度的内容时,也就断开了

在http1.1允许你不写content-length,比如要发送的长度确实不知道时

这事需要一个特殊的content-type:chunked

分块传输的原理是这样的:

123H\r\n

123H个长度的内容传输给客户端…\r\n

41H\r\n

浏览器继续接受41H长度的内容.\r\n

0\r\n(服务器说内容发完了)

length,收到指定的length长度的内容时,也就断开了

在http1.1允许你不写content-length,比如要发送的长度确实不知道时

这事需要一个特殊的content-type:chunked

分块传输的原理是这样的:

123H\r\n

123H个长度的内容传输给客户端…\r\n

41H\r\n

浏览器继续接受41H长度的内容.\r\n

0\r\n(服务器说内容发完了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值