浏览器缓存
浏览器一般会在用户的文件系统创建一个文件夹存放临时文件 .
浏览器缓存只是针对它所属的用户有效 .
HTTP缓存协商 : 请求 -> 服务器返回并告知缓存 -> 再次请求并询问是否使用缓存 -> 服务器接收询问,决定 使用缓存 或 重新返回数据
Last-Modified(最后修改时间) :
动态文件一般不存在传统意义上的最后修改时间 , 而静态文件则是有服务器自动给添加的最后修改时间 , 使用的是 GMT 时间格式.
服务器返回并告知缓存 的时候 , 会在返回头信息里面添加一个 Last-Modified 属性 , 并指定一个时间值 , 再次请求的时候 , 浏览器会在请求头信息里面添加一个 If-Modified-Since 的属性 , 并把缓存的最后时间给带上 , 服务器会自动判断文件是否在 If-Modified-Since 值之后有更新 , 如果有更新则返回新数据 , 没有更新则返回 304 Not Modified
给PHP程序添加 Last-Modified : header("Last-Modified: ".gmdate("D , d M Y H:i:s") . " GMT") ;
动态程序的 Last-Modified 再次请求时 , 服务器不会自动判断 , 需要手动写 PHP 程序获取值判断觉得返回 : $_SERVER['HTTP_IF_MODIFIED_SINCE']
Last-Modified(最后修改时间)的缺点 :
1 时间数据内容没有做修改 , 但是文件的最后修改时间改变了 , 也会重新返回数据 , 比如 文件内容里加了一个空格
2 分布式部署 , 负载均衡时 , 多台服务器部署的同一文件最后修改时间不同 , 也会频繁的重新返回数据
另一种协商方法 : ETag
ETag : 没有采用内容的最后修改时间 , 而是采用了一串编码来标记内容 。 如果 ETag 没有变化 , 那么这个内容即没有更新 。 Web 服务器会给静态页面生成一个 ETag 。
浏览器缓存截止期 : Expires
Expires : 告诉浏览器该内容在何时过期 , 并暗示浏览器在该内容过期之前不需要再询问服务器 , 而直接使用本机缓存即可 。
默认情况下 , Web 服务器不会给静态文件添加 Expires 标记
Expires 缺点 : 服务器返回 Expires 标记的值时服务器时间 , 如果本机时间跟 服务器时间不一致 , 则会导致该标记无效 。
Expires 弥补 : HTTP/1.1 中还有一个标记用于弥补 Expires 的不足 , 那就是 Cache-Control
Cache-Control : max-age=<second> , 这里指定了缓存过期的相对时间 , 单位是秒 , 并且这个时间是相对于浏览器本地的时间 。
Expires 和 Cache-Control 时 , 浏览器会优先考虑 Cache-Control