http缓存机制
来源:互联网 发布:希风绝地反击 源码 编辑:程序博客网 时间:2024/05/21 08:50
web服务器通过http发送字段可以指定浏览器缓存
HTTP 1.0 中的 Expires 是1.0中指定的浏览器缓存时间
HTTP 1.1 中的Cache-Control 指定浏览器缓存时间
浏览器会将请求内容存储到本地,以url为key内容为content存储
若指定浏览器缓存时间,浏览器会通过检测 Expires / Cache-Control 与Date(收到内容缓存的时间),缓存过期会发送请求到web服务器
Cache-Control 的值可以有以下:
Public指示响应可被任何缓存区缓存。Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。no-cache指示请求或响应消息不能缓存no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
常用max-age:num_sec 指定缓存时间
Cache-Control 与 Last-Modified/If-Modified-Since 结合使用
设置 Last-Modified到浏览器,浏览器存储这个值,这个值是文件最后一次改动的时间,时间格式为GMT
当Cache-Control 指定的缓存时间过期后 浏览器发送 请求头 If-Modified-Since 是这个最后修改时间
web服务器可以自己判断文件是否过期选择发送 200还是304(强制浏览器使用本地缓存)
判断代码:
// 根据文件修改时间判断$mtime = filemtime(__FILE__); // 文件修改时间if(array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER)&&strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])>=$mtime) //对比文件修改时间{header('HTTP/1.1 304 Not Modified');}header("Cache-Control: max-age=10");header("Last-Modified: ".gmdate('l, d F Y H:i:s',$mtime).' GMT');
Cache-Control与 Etag/If-None-Match 结合使用 (优先级高于Last-Modified/If-Modified-Since)
发送ETag到浏览器,浏览器存储值,这个值可以自己设置,默认Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的
当Cache-Control 指定的缓存时间过期后 浏览器发送 请求头 If-None-Match 这个是浏览器得到的ETag
web服务器可以自己判断文件是否过期选择发送 200还是304(强制浏览器使用本地缓存)
判断代码:(这里使用的是sha1_file 判断文件是否修改)
// 根据tag判断是否缓存$tag = sha1_file(__FILE__);if(array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER)&&$_SERVER['HTTP_IF_NONE_MATCH']==$tag) //对比文件修改时间{header('HTTP/1.1 304 Not Modified');}header("Cache-Control: max-age=10");header("ETag: ".$tag);
总结:
Date 是浏览器获取数据(http 200)的时间,这也是浏览器生成本地缓存的时间
Expires 指定浏览器缓存时间 http1.0
Cache-Control 指定浏览器缓存时间 http1.1 优先级比 Expires高且可设置项更多
Last-Modified/If-Modified-Since与Etag/If-None-Match
后者的优先级高,都是在浏览器缓存时间过期后会发送头信息到web服务器,是否304由web服务器端自行处理
ETag更灵活,Last-Modified 只能设置GMT格式的时间
用户的操作对缓存的影响:
用户操作
Expires/Cache-Control
Last-Modified/Etag
地址栏回车
有效
有效
页面链接跳转
有效
有效
新开窗口
有效
有效
前进、后退
有效
有效
F5刷新
无效
有效
Ctrl+F5刷新
无效
无效
参考:
http://blog.csdn.net/czp11210/article/details/37693553
http://blog.csdn.net/dinglang_2009/article/details/38142641
- HTTP缓存机制--客户端缓存
- Http缓存机制
- iOS http缓存机制
- Http缓存机制
- 浅谈HTTP缓存机制
- Http中缓存机制
- 浅谈HTTP缓存机制!
- http 缓存机制
- http缓存机制
- 浅谈HTTP缓存机制!
- HTTP浏览器缓存机制
- http 缓存机制
- Volley HTTP 缓存机制
- Http缓存机制
- HTTP缓存机制
- HTTP缓存机制
- HTTP缓存机制
- Volley Http缓存机制
- 他乡
- 使用反射模拟实现hibernate
- 异常
- 七牛云存储三周年重磅分享:创业、投资、产业
- 接口和抽象类的区别、抽象方法的一些特点、抽象类是否可继承实体类(concrete class)
- http缓存机制
- k70学习笔记(1. icf文件解释,工程结构图,常规中断)
- 2种IO并发开发中的设计模式:Reactor and Proactor
- 以云计算的速度部署云计算基础设备
- 使用Tornado进行网络异步编程
- 使用 PHPMailer 发送邮件
- 微软要开放 IE?不,是 Windows Azure
- [Leetcode]Add Two Numbers
- Ubuntu 下使用 CloudFlare 动态域名