HTTP缓存过期
expration是两个缓存模型里效率更高、更直接的一个,因此应该被尽可能多地使用。当一个响应通过expiration被缓存时,缓存将保存响应,并且在过期之前直接返回它,而毋须命中程序。
过期模型,可以通过以下几乎一样的两种Http头之一来实现:Expires
或Cache-Control
。
使用Cache Control头控制过期 ¶
因为Expires
头的限制,多数情况下,你应该使用Cache-Control
头来替代。记得,Cache-Control
头被用于多种不同的缓存指令。例如,max-age
和s-maxage
。第一个用于全部缓存,而第二个仅在共享缓存时用到。
1 2 3 4 5 6 7 8 |
// Sets the number of seconds after which the response
// should no longer be considered fresh
// 设置“响应过期”的秒数
$response->setMaxAge(600);
// Same as above but only for shared caches
// 同上,但仅用于共享缓存
$response->setSharedMaxAge(600); |
Cache-Control
头一般是下述格式(但有时也会有其他指令):
Cache-Control: max-age=600, s-maxage=600
使用Expires头控制过期 ¶
根据HTTP specification,“Expires
头字段将在response被认为是stale之后给出date/time。”。这里的Expires
头可以被设为Response
方法:setExpires()
。它使用DateTime
实例作为参数:
1 2 3 4 |
$date = new DateTime();
$date->modify('+600 seconds');
$response->setExpires($date); |
该响应的HTTP头信息类似这种:
1 |
Expires: Thu, 01 Mar 2011 16:00:00 GMT |
setExpires()
方法将自动转换日期为GMT时区,因为这是HTTP specification(协议)的要求。
注意,在HTTP 1.1版之前,并不需要原始服务器来发送Date
头。因此,缓存(比如浏览器的)就需要本地时钟来评估Expires
头,进而令缓存周期的计算因时间倾斜而变得脆弱不堪。另外一个Expires
头限制是,正如http协议中所描述的,“HTTP/1.1 不得发送Expires
的日期超过一年。”