PHP Yii框架缓存高级用法:页面缓存与HTTP缓存配置详解
深入解析PHP Yii框架的高级缓存机制,包括服务器端的页面缓存(PageCache)与客户端的HTTP缓存(HttpCache)。文章详细说明了如何通过配置Last-Modified、ETag及Cache-Control等HTTP头来减少重复请求和服务端渲染开销,并提供了具体的过滤器配置代码以优化Web应用性能。
页面缓存配置
页面缓存旨在服务器端存储整个页面的生成结果。当相同页面再次被请求时,系统直接从缓存中提取内容,而无需重新执行控制器逻辑或视图渲染,从而显著降低服务器负载。
第1步:使用 PageCache 过滤器
目的:为特定的控制器操作启用服务器端页面缓存,并设置失效条件。
入口:控制器的 behaviors() 方法。
动作:返回一个包含 yii\filters\PageCache 类的行为数组。该过滤器支持以下关键配置项:
only:指定受影响的动作(如 'index')。duration:缓存持续秒数(如 60 秒)。variations:根据应用状态变化的变量(如语言),不同变量值对应不同缓存版本。dependency:定义缓存依赖,当数据源变化时使缓存失效。
public function behaviors()
{
return [
[
'class' => 'yii\filters\PageCache',
'only' => ['index'],
'duration' => 60,
'variations' => [
\Yii::$app->language,
],
'dependency' => [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT COUNT(*) FROM post',
],
],
];
}
上述示例中,index 动作的页面将被缓存 60 秒。如果用户语言变更,将获取对应的缓存版本;若数据库中文章总数变化,缓存将立即失效。注意,页面缓存基于过滤器实现,而片段缓存通常基于小部件,两者可同时使用。
HTTP 客户端缓存配置
除了服务器端缓存,Web 应用还可利用 HTTP 头让浏览器缓存资源。通过 yii\filters\HttpCache 过滤器,可为 GET 和 HEAD 请求设置缓存验证机制,避免不必要的流量传输。
第2步:配置 Last-Modified 头
目的:基于内容的最后修改时间判断缓存是否过期。
入口:yii\filters\HttpCache::lastModified 属性。
动作:提供一个 PHP Callable 函数,接收当前 Action 和参数,返回 Unix 时间戳。浏览器首次请求后,若服务器未检测到时间更新,将返回 304 Not 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');
},
],
];
}
第3步:配置 ETag 头
目的:通过内容哈希值精确判断页面是否发生变更,比时间戳更灵活。
入口:yii\filters\HttpCache::etagSeed 属性。
动作:提供 PHP Callable 返回种子字符串(如序列化后的标题和内容)。系统自动生成哈希值作为 ETag。若种子不变,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]);
},
],
];
}
注意:复杂的 ETag 计算会增加服务器每次请求的开销,应尽量保持种子生成的简洁性。若同时配置了 ETag 和 Last-Modified,遵循 RFC 7232 协议,优先接受 If-None-Match 头。
第4步:配置 Cache-Control 头
目的:直接指定缓存策略指令。
入口:yii\filters\HttpCache::cacheControlHeader 属性。
动作:自定义缓存控制标头。默认值为 Cache-Control: public, max-age=3600,表示公共资源可缓存 1 小时。也可配置为 private、no-cache 等以满足不同安全需求。
会话缓存冲突处理与 SEO 影响
会话缓存限制器
启用 Session 时,PHP 默认会根据 php.ini 中的 session.cache_limiter 发送破坏性的 HTTP 头(如 Pragma: no-cache)。这会导致 HttpCache 失效。为解决此问题,可在 HttpCache 中配置 sessionCacheLimiter 属性,显式指定为 public 或 private 以覆盖默认行为。
SEO 影响
合理的缓存策略能减少重复抓取,提高爬虫效率。搜索引擎通常尊重网站的缓存指令,良好的缓存设置有助于提升网站响应速度和用户体验,间接对排名产生积极影响。
以上就是PHP的Yii框架中缓存的一些高级用法的详细内容,更多关于PHP Yii框架优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









