博文原连接php
http://xiaozhuge0825.blog.163.com/blog/static/57606068201222842351928/ chrome
当咱们想尽办法提升服务器负载能力的时候,是否曾想过,其实浏览器也有缓存功能,咱们也能够利用浏览器的缓存功能来减小服务器的负载,提升网站吞吐量?本章咱们就来说讲浏览器的缓存功能并加以利用。 浏览器
当咱们使用抓包工具查看http状态时,咱们能够看到200,304,from cache之类的标识,也许你也早已注意到了他们,并明白他们的意思。可是,你是否想过在你的程序中加入代码主动告诉浏览器,更好地利用浏览器缓存。 缓存
备注:本章全部案例都是使用chrome 17.0.963.79 m浏览器,测试方式为每次打开浏览器新窗口的方式测试,而不是F5刷新。 服务器
咱们先作一个没有缓存的页面,叫作nocache.php
代码以下:并发
<?php
echo time();
?>
用浏览器打开,咱们能够看到每次打开页面,都是打印新的时间,返回的状态码是200,代表在默认状况下,咱们的浏览器没有使用缓存。ide
咱们再作一个页面,叫作last_modified.php
代码以下:工具
<?php
$cache_time = 3600;
$modified_time = @$_SERVER['HTTP_IF_MODIFIED_SINCE'];
if( strtotime($modified_time)+$cache_time > time() ){
header("HTTP/1.1 304");
exit;
}
header("Last-Modified: ".gmdate("D, d M Y H:i:s", time() )." GMT");
echo time();
?>
用浏览器打开,咱们能够看到第一次打开,返回的状态码为200,打印时间为最新时间。而后咱们第二次打开,能够看到状态码为304,时间和刚才的时间同样,代表咱们是使用到缓存了。咱们删除last_modified.php文件,而后第三次打开页面,浏览器返回404错误,可见Last-Modified虽然使用了缓存,可是每次打开页面依然须要向服务器发起http请求,浏览器根据用户的$_SERVER['HTTP_IF_MODIFIED_SINCE']来判断浏览器的内容是否过时,没过时的话返回304状态,浏览器内容从缓存中读取。测试
咱们再作一个页面,叫作 expires.php
代码以下:网站
<?php
$cache_time = 3600;
header("Expires: ".gmdate("D, d M Y H:i:s", time()+$cache_time )." GMT");
echo time();
?>
用浏览器打开,咱们能够看到第一打开,返回的状态为200,时间为最新的时间。而后咱们第二次打开,能够看到状态码依然是200,时间依然是旧的时间,Size栏目显示为from cache,表示内容是直接从浏览器读取。咱们删除expires.php文件,而后第三次在新窗口中打开,能够看到返回200状态码,打印时间依然是旧的,Size依然提示为from cache,因而可知,设置了Expires,就算删除页面,浏览器端依然能够显示,代表浏览器根本就没有向服务器发起http请求。
到这里,也许你会感受Expires比Last-Modified缓存效果更好是吧,由于本地有缓存数据时,不须要向服务器发起http请求,服务器的并发数会明显的减小,能够少处理不少http请求。可是Expires也有缺点,那就是设置的过时时间是服务器的时间,而不是你本地的时间,这样若是服务器时间跟你本地时间不一致时,可能并无起到缓存的效果。HTTP/1.1为了弥补Expirse的不足,引入了Cache-Control标记。格式以下Cache-Control: max-age=<second>,这个时间是相对浏览器本地时间,因此更加准确。
咱们再作一个页面,叫作cached_control.php
代码以下:
<?php
$cache_time = 3600;
header("Cache-Control: max-age=".$cache_time);
echo time();
?>
咱们测试能够获得设置Expires同样的效果,也就是缓存后,删除文件,依然在浏览器缓存有效期内能够正常访问页面。
好了,over了,下次当你服务器并发过高,服务器资源和带宽资源不足时,请记住伟大的浏览器缓存吧!也许你依然不觉得然,以为提升服务器的吞吐量有不少办法,好比在服务器端作缓存,把页面静态化,等等。可是我相信有一个东西你应该会在乎,没错,就是带宽,在乎吧?若是能利用好浏览器缓存,将能够下降你的宽带资源,这样不是很好吗。