
HTTP协议缓存的目标是在许多情况下消除对发送请求的需要,在许多情况下消除对发送完整请求的需要. 通过不发送请求或减少请求传输的数据量来优化整个HTTP体系结构,该目标的实现可以带来以下好处:
缓存的基本过程包括七个步骤.
Receive-Cache从网络读取传入的请求数据包分析-Cache分析数据包,提取URL和各种标头查询-Cache以查看是否有本地副本,如果没有,请获取副本缓存算法,并将其保存在本地新鲜度测试缓存,以查看缓存的副本是否足够新鲜,如果不是,请询问服务器是否有任何更新来创建响应-缓存将使用新的标头和缓存的主体来构建响应消息以发送到缓存通过网络将响应发送回客户端日志-缓存可以选择创建一个日志文件条目来描述交易

此处的缓存可以是本地客户端缓存,也可以是公共缓存(例如代理缓存).
HTTP缓存可以实现文档一致性,而无需依赖服务器来记住哪些缓存具有文档副本. 这些机制称为文档到期和服务器重新验证,也可以称为截止和验证模型.
截止模型是HTTP请求中标记文档的到期时间. HTTP协议使用以下两个字段来标记到期时间:

使用截止模型是不够的. 即使文档过期,也并不意味着当前文档和原始服务器的文档不一致. 现在该确认模型正在执行其工作了. 验证模型需要询问原始服务器文档是否已更改. 它取决于HTTP协议的以下字段:
如果服务器响应中包含ETag和Last-Mofidied值,则客户端在发送请求时会使用两种验证机制,并且在满足这两种验证机制时缓存算法,只会返回304未修改.
缓存仅需要在新鲜度检测期间计算两个值: 缓存副本的生存期和缓存副本的新鲜生存期.

响应的生存期是自服务器发布响应(或通过验证模型进行重新验证)以来经过的总时间. 使用时间包括Internet上的传输时间,中间节点中缓冲的时间以及本地缓存中的停留时间.
/* * age_value 当代理服务器用自己的头部去响应请求时,Age标明实体产生到现在多长时间了。 * date_value HTTP 服务器应答中的Date字段 原始服务器 * request_time 缓存的请求时间 * response_time 缓存获取应答的时间 * now 当前时间 */ apparent_age = max(0, response_time - date_value); //缓存收到响应时响应的年龄 处理时钟偏差存在时,可能为负的情况 corrected_received_age = max(apparent_age, age_value); // 容忍Age首部的错误 response_delay = response_time - request_time; // 处理网络时延,导致结果保守 corrected_initial_age = corrected_received_age + response_delay; resident_time = now - response_time; // 本地的停留时间,即收到响应到现在的时间间隔 current_age = corrected_initial_age + resident_time;
因此,完整的生存期计算算法是通过查看Date标头和Age标头来确定响应已被使用的时间,然后将其在本地缓存中的停留记录为总生存期. 另外,HTTP协议可以补偿时钟偏斜和网络延迟,尤其是可以补偿网络延迟,这可以重复计算所用的时间,因此整个算法会产生保守的结果. 有了这种保守的效果,如果出现问题,该算法只会使文档看起来比实际使用期限更旧,并触发重新验证.

基于缓存文档的使用寿命,并根据服务器和客户端的限制来计算新的生存期,可以确定缓存的文档是否是新的. 缓存文档的使用寿命已在前面介绍. 在本节中,让我们看一下新鲜寿命的计算.
为了确定响应是新鲜的还是陈旧的,我们需要比较其新鲜度和寿命. 有关年龄的计算,请参见第13.2.3节. 本节说明如何计算保质期并确定响应是否已过期. 在下面的讨论中,数值可以用适合算术运算的任何形式表示.
与此相关的头字段包括(从最高优先级到最低优先级): Cache-Control字段中“ max-age”控制指令的值,Expires,Last-Modified和默认的最小生存期. PHP代码如下:
/** * $heuristic 启发式过期值应不大于从那个时间开始到现在这段时间间隔的某个分数 * $Max_Age_value_set 是否存在Max_Age值 Cache-Control字段中“max-age”控制指令的值 * $Max_Age_value Max_Age值 * $Expires_value_set 是否存在Expires值 * $Expires_value Expires值 * $Date_value Date头部 * $default_cache_min_lifetime * $default_cache_max_lifetime */ function server_freshness_limit global $Max_Age_value_set, $Max_Age_value; global $Expires_value_set, $Expires_value; global $Date_value, $default_cache_min_lifetime, $default_cache_max_lifetime; $factor = 0.1; //典型设置为10% $heuristic = 0; // 启发式 默认为0 if $Max_Age_value_set // 优先级一为 Max_Age $freshness_lifetime = $Max_Age_value; elseif$Expires_value_set // 优先级二为Expires $freshness_lifetime = $Expires_value - $Date_value; elseif$Last_Modified_value_set // 优先级三为Last_Modified $freshness_lifetime = int$factor * max0, $Last_Modified_value - $Date_value; $heuristic = 1; // 启发式 else $freshness_lifetime = $default_cache_min_lifetime; $heuristic = 1; // 启发式 if $heuristic $freshness_lifetime = $freshness_lifetime > $default_cache_max_lifetime ? $default_cache_max_lifetime : $freshness_lifetime; $freshness_lifetime = $freshness_lifetime < $default_cache_min_lifetime ? $default_cache_min_lifetime : $freshness_lifetime; return $freshness_lifetime;
计算响应是否过期非常简单: response_is_fresh =(server_freshness_limit()> current_age)
这是《 HTTP权威指南》的第七章.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-236110-1.html
作品是能不断挖掘自己潜质和获得肯定的根本