使用期算法:
/* * 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; // 各个计算都极可能保守 // 响应使用期 = max( 响应时间 - 响应头部date,响应中age ); // 传输延迟时间 = 响应时间 - 请求时间 // 使用期中至少不低于这个指 // 停留缓存时间 = 当前时间 - 响应时间 // 保守使用期 = 响应响应使用期 + 传输延迟时间 + 停留缓存时间 // 这个值不是精准,是保存估计的值
新鲜度算法:
/** * $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 * max(0, $Date_value - $Last_Modified_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; } // 新鲜度算法 // max-age 》 expires - date_header 》 factor * max(0,date_header - last_modified_date)》default_cache_min_date // 并检查结果是否超过缓存的最大或者最小新鲜度