除了我们在上一节中描述的服务器端缓存外,Web 应用程序还可以利用客户端缓存来节省生成和传输相同页面内容的时间。
要使用客户端缓存,您可以将 yii\filters\HttpCache 配置为控制器操作的过滤器,其渲染结果可以在客户端缓存。 HttpCache 仅适用于 GET
和 HEAD
请求。它可以处理这三种类型的请求的缓存相关的 HTTP 头
Last-Modified
头 ¶Last-Modified
头使用时间戳来指示页面自客户端缓存以来是否已修改。
您可以配置 yii\filters\HttpCache::$lastModified 属性以启用发送 Last-Modified
头。该属性应为一个 PHP 可调用函数,返回关于页面修改时间的时间戳。PHP 可调用函数的签名应如下所示:
/**
* @param Action $action the action object that is being handled currently
* @param array $params the value of the "params" property
* @return int a UNIX timestamp representing the page modification time
*/
function ($action, $params)
以下是如何使用 Last-Modified
头的示例
public function behaviors()
{
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
return $q->from('post')->max('updated_at');
},
],
];
}
上面的代码表明,HTTP 缓存应仅为 index
操作启用。它应该根据帖子的最后更新时间生成一个 Last-Modified
HTTP 头。当浏览器第一次访问 index
页面时,页面将在服务器上生成并发送到浏览器;如果浏览器再次访问同一页面,并且期间没有帖子被修改,服务器将不会重新生成页面,浏览器将使用客户端的缓存版本。因此,服务器端渲染和页面内容传输都被跳过。
ETag
头 ¶“实体标签”(或简称 ETag
)头使用哈希来表示页面的内容。如果页面发生更改,哈希也会发生更改。通过比较客户端保存的哈希与服务器端生成的哈希,缓存可以确定页面是否已更改,是否应该重新传输。
您可以配置 yii\filters\HttpCache::$etagSeed 属性以启用发送 ETag
头。该属性应为一个 PHP 可调用函数,返回用于生成 ETag 哈希的种子。PHP 可调用函数的签名应如下所示:
/**
* @param Action $action the action object that is being handled currently
* @param array $params the value of the "params" property
* @return string a string used as the seed for generating an ETag hash
*/
function ($action, $params)
以下是如何使用 ETag
头的示例
public function behaviors()
{
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['view'],
'etagSeed' => function ($action, $params) {
$post = $this->findModel(\Yii::$app->request->get('id'));
return serialize([$post->title, $post->content]);
},
],
];
}
上面的代码表明,HTTP 缓存应仅为 view
操作启用。它应该根据请求帖子的标题和内容生成一个 ETag
HTTP 头。当浏览器第一次访问 view
页面时,页面将在服务器上生成并发送到浏览器;如果浏览器再次访问同一页面,并且帖子的标题和内容没有变化,服务器将不会重新生成页面,浏览器将使用客户端的缓存版本。因此,服务器端渲染和页面内容传输都被跳过。
ETag 允许比 Last-Modified
头更复杂和/或更精确的缓存策略。例如,如果网站切换到另一个主题,ETag 可以失效。
昂贵的 ETag 生成可能会违背使用 HttpCache
的目的,并引入不必要的开销,因为它们需要在每次请求时重新评估。尝试找到一个简单的表达式,如果页面内容已修改则使缓存失效。
注意:根据 RFC 7232 的规定,如果同时配置了
ETag
和Last-Modified
标头,HttpCache
会同时发送这两个标头。如果客户端同时发送If-None-Match
标头和If-Modified-Since
标头,则只尊重前者。
Cache-Control
标头 ¶Cache-Control
标头指定页面的通用缓存策略。可以通过配置 yii\filters\HttpCache::$cacheControlHeader 属性来发送它。默认情况下,将发送以下标头
Cache-Control: public, max-age=3600
当页面使用会话时,PHP 会自动发送一些与缓存相关的 HTTP 标头,如 session.cache_limiter
PHP INI 设置中指定的。这些标头可能会干扰或禁用您想要从 HttpCache
获得的缓存。为了防止此问题,默认情况下,HttpCache
将自动禁用发送这些标头。如果您想要更改此行为,您应该配置 yii\filters\HttpCache::$sessionCacheLimiter 属性。此属性可以接受字符串值,包括 public
、private
、private_no_expire
和 nocache
。有关这些值的说明,请参阅有关 session_cache_limiter() 的 PHP 手册。
搜索引擎机器人倾向于尊重缓存标头。由于一些爬虫在特定时间段内对每个域处理的页面数量有限制,引入缓存标头有助于索引您的网站,因为它们减少了需要处理的页面数量。
发现错误或您认为此页面需要改进吗?
在 github 上编辑它 !
注册 或 登录 以发表评论。