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


0 0
原创粉丝点击