HTTP 缓存过期
过期模型是两种缓存模型中最有效和最直接的模型,应尽可能使用。当响应通过过期时间进行缓存时,缓存会直接返回该响应,而不会访问应用程序,直到缓存的响应过期。
过期模型可以使用两个几乎相同的 HTTP 标头来实现:Expires
或 Cache-Control
。
使用 Cache-Control
标头过期
大多数时候,你将使用 Cache-Control
标头,它用于指定许多不同的缓存指令
1 2 3 4 5 6 7 8
use Symfony\Component\HttpKernel\Attribute\Cache;
// ...
#[Cache(public: true, maxage: 600)]
public function index(): Response
{
// ...
}
Cache-Control
标头将采用以下格式(它可能具有其他指令)
1
Cache-Control: public, max-age=600
注意
使用 setSharedMaxAge()
方法不等同于同时使用 setPublic()
和 setMaxAge()
方法。根据 RFC 7234 的 提供陈旧响应 部分,s-maxage
设置(通过 setSharedMaxAge()
方法添加)禁止缓存在 stale-if-error
场景中使用陈旧响应。这就是为什么建议同时使用 public
和 max-age
指令。
使用 Expires
标头过期
Cache-Control
标头的替代方案是 Expires
。两者之间没有优势或劣势之分。
根据 HTTP 规范,“Expires
标头字段给出了响应被视为过期的日期/时间。” 可以使用 #[Cache]
属性的 expires
选项或 setExpires()
Response
方法设置 Expires
标头
1 2 3 4 5 6 7 8
use Symfony\Component\HttpKernel\Attribute\Cache;
// ...
#[Cache(expires: '+600 seconds')]
public function index(): Response
{
// ...
}
生成的 HTTP 标头将如下所示
1
Expires: Thu, 01 Mar 2011 16:00:00 GMT
注意
expires
选项和 setExpires()
方法会自动将日期转换为 GMT 时区,这是规范要求的。
请注意,在 1.1 之前的 HTTP 版本中,原始服务器不需要发送 Date
标头。因此,缓存(例如浏览器)可能需要依赖本地时钟来评估 Expires
标头,从而使生存期计算容易受到时钟偏差的影响。Expires
标头的另一个限制是,规范指出“HTTP/1.1 服务器不应发送未来一年以上的 Expires
日期。”
注意
根据 RFC 7234 的 计算新鲜度生存期 部分,当定义了 Cache-Control
标头的 s-maxage
或 max-age
指令时,Expires
标头值将被忽略。