浏览器缓存主要有两类
缓存协商:Last-midified ,Etag
完全缓存:cache-control,Expires
缓存协商的意思是须要去服务器端询问页面有没有修改过,没有修改过则返回304直接使用缓存内容,不然返回新内容
协商步骤:
php
服务器发送带Last-midified:GMTtime 头的http response浏览器
浏览器下次请求时带上if-modified-since:GMTtime http 请求头缓存
服务端用本地Last-midified时间与if-modified-since比较,计算浏览器数据是否过时并发送响应服务器
last-midified示例:并发
<?php
$modified_time = @$_SERVER['HTTP_IF_MODIFIED_SINCE'];
if( strtotime($modified_time) + 3600>time() ){
header('HTTP/1.1 304');
exit;
}
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
echo time();
?>工具
Etag的工做原理与Last-midified相似,不一样点在于Etag的值是用户可自定义的
缓存协商可应用在动态页面且实时性不是特别强的页面,如网站首页
完全缓存
完全缓存的意思是在缓存失效以前再也不须要跟服务器交互
经常使用的是Expires,Expires的值是一个绝对时间,由服务器产生
这儿存在一个问题,就是服务器的时间可能给客户端的时间不一致致使缓存时间的误差
要解决这个问题就要使用cache-control,它保存的是一个相对浏览器的时间
若是同时存在cache-control和Expires怎么办呢?
浏览器老是优先使用cache-control,若是没有cache-control才考虑Expires
浏览器缓存最大的价值是节省了带宽
为何没有提升吞吐率呢? 下面来分析一下
这里分两种状况:静态页面和动态页面
服务端加载静态页面须要进行磁盘IO,浏览器缓存则可节省这部分时间,不过服务器通常会用squid等工具进行缓存,因此静态资源在提升吞吐率方面效果不明显
再来看一看动态资源
动态资源也分为两类:实时动态和准实时动态
实时动态是不能用浏览器缓存的
准实时动态页面可节省磁盘IO和计算时间,可是让浏览器缓存的时间不可过久,且在本地重复访问的几率也不大
因此说动态内容在提升吞吐率方面效果也不明显
对于准实时动态页面却是能够缓存在服务端,如squid
网站