HTTP缓存过期

3.4 版本
维护中的版本

expration是两个缓存模型里效率更高、更直接的一个,因此应该被尽可能多地使用。当一个响应通过expiration被缓存时,缓存将保存响应,并且在过期之前直接返回它,而毋须命中程序。

过期模型,可以通过以下几乎一样的两种HTTP头之一来实现:ExpiresCache-Control

过期和验证(Expiration and Validation)

你当然可以对同一个Response同时使用validation和expiration。因为expiration的优势大过validation,你能很容易地从两个世界中好的一面受益。也就是说,同时使用过期和验证,你可以命令缓存来服务于已缓存的内容,同时还能在某些区间(expiration)向后检查以确认缓存内容仍然有效。

你也可以通过annotation来为expiration和validation去定义HTTP缓存头。参考FrameworkExtraBundle文档。

使用Cache Control头控制过期 

因为Expires头的限制,多数情况下,你应该使用Cache-Control头来替代。记得,Cache-Control头被用于多种不同的缓存指令。例如,max-ages-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的日期超过一年。”

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)