讲师中心 微信公众号
AI工具推荐 视频效率加速

什么是yii2的缓存依赖?如何使用缓存依赖?

秋墨姑娘_3222

秋墨姑娘_3222

发布时间:2019-02-26 11:43:11

|

2733人浏览过

|

来源于博客园

转载

本篇文章给大家带来的内容是介绍什么是yii2的缓存依赖?如何使用缓存依赖?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

概述

缓存是Yii2的强大特性之一,合理使用缓存技术可以有效地减小服务器的访问压力。Yii2最基本的缓存包括数据缓存、片段缓存、页面缓存和HTTP缓存,这部分内容在官方文档中有更加详细的说明,这里不再赘述,如有需要可以参考Yii2官方开发文档中的缓存部分。

页面缓存

数据缓存与片段缓存都是针对网站中某一部分内容进行的缓存,这种缓存需要在代码部分进行显示声明,修改起来比较麻烦。相对的页面缓存则是针对控制器下方法,对这个方法的视图文件进行页面级别的缓存。由于页面缓存可以使用行为的形式,对控制器进行注入,修改的时候只要在控制器中修改对应的配置项即可,所以使用页面缓存更加简单,扩展性更强。

缓存依赖

一般来说,缓存可以增强服务器的性能,但会一定程度上减弱其交互性。所以需要对缓存进行定期的检查,清理过期数据,填充最新数据,以保证内容的及时准确。在这一点上,Yii2的缓存依赖可以有效解决这个问题。Yii2共有五个内置的缓存类,如下所示:

  • yii\caching\ChainedDependency:如果依赖链上任何一个依赖产生变化,则依赖改变。

  • yii\caching\DbDependency:如果指定 SQL 语句的查询结果发生了变化,则依赖改变。

  • yii\caching\ExpressionDependency:如果指定的 PHP 表达式执行结果发生变化,则依赖改变。

  • yii\caching\FileDependency:如果文件的最后修改时间发生变化,则依赖改变。

  • yii\caching\TagDependency:将缓存的数据项与一个或多个标签相关联。 您可以通过调用 yii\caching\TagDependency::invalidate() 来检查指定标签的缓存数据项是否有效。

    btpanel phpsite 宝塔面板PHP网站
    btpanel phpsite 宝塔面板PHP网站

    宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

    下载

以数据库依赖DbDependency为例,在控制器IndexController中,声明依赖关系:

<?php
namespace frontend\controllers;
use yii\web\Controller;
class IndexController extends Controller{
    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',
                ],
            ],
        ];
    }

    public function actionIndex()
    {
        return $this->render('index');
    }
    
}

如代码所示,在行为方法behaviors()中声明页面配置的驱动类,only对应为一个数组,数组元素是需要缓存的方法对应的视图。duration表示过期时间,单位为秒。variations对应一个数组,系统会监听这个数组中内容是否发生了变化,如果发生变化就会刷新缓存,反之则不会。dependency对应依赖关系,其中class表示缓存依赖的类,sql表示一个一条查询语句。含义就是post数据表中记录的总条数发生变化时,就可以认为新增或者删除类某条数据,需要刷新缓存。

链式依赖

上面的例子非常简单,而实际开发往往要更加复杂。有时候一个页面是否需要刷新由很多因素决定,不是一个关系就可以描述清楚的。比如说post数据表中既没有删除没有增加,而是更新一条数据,那上面那查询语句就无法处理类。这时候,可以用SELECT MAX(*) FROM post检测更新,但内置页面缓存类中无法直接写入这两个查询,这时候可以用链式依赖的内置类来解决这个问题。

所谓链式依赖,就是将缓存依赖关系配置到一个链中,一旦链中某个关系不成立,就会刷新缓存。
其中yii\caching\ChainedDependency就是缓存依赖的主要实现类。

实现代码如下所示:

<?php

namespace frontend\controllers;

use yii\web\Controller;

class IndexController extends Controller
{
    public function behaviors()
    {
        return [
            'pageCache' => [
                'class' => 'yii\filters\PageCache',
                'only' => ['index'],
                'duration' => 24 * 3600 * 365, // 1 year
                'variations' => [
                    \Yii::$app->language,
                    \Yii::$app->id
                ],
                'dependency' => [
                    'class' => 'yii\caching\ChainedDependency',
                    'dependencies' => [
                        new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM post']),
                        new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(id) FROM post']),
                        new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM category']),
                        new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(id) FROM category']),
                        new \yii\caching\ExpressionDependency(['expression'=>'\Yii::$app->request->get("id")']);
                        new \yii\caching\FileDependency(['fileName'=>'yanying.txt']);
                    ]
                ],
            ],
        ];
    }

    public function actionIndex()
    {
        return $this->render('index');
    }
    
}

如上所示,dependency中配置类Yii2内置的链式依赖,并在dependencies中定义类缓存依赖关系的“链”。当链上某个关系不成立时,就会刷新缓存。另外在整个缓存页面中,如果某一小部分并不需要缓存,可以将其设置为动态内容,这部分可以查看官方文档,不过更推荐看源码,文档介绍的比较简单。

总结

Yii2没有提供HTML页面静态化的内置功能,而是提供了缓存机制。在开发网站的时候可以通过伪静态+缓存的方式优化内容页面,并且采用内置的缓存依赖和链式依赖解决内容过期的问题,通过动态内容的设置处理不需要缓存的部分,比如登录后,首页可以会显示用户名,这部分就可以用动态内容。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4763

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

971

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1249

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6761

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3483

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6740

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9341

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1270

2024.04.29

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii2中文手册
Yii2中文手册

共0课时 | 0.6万人学习

thinkphp基础介绍和yii2基础介绍
thinkphp基础介绍和yii2基础介绍

共10课时 | 2.6万人学习

Yii2框架基础视频教程
Yii2框架基础视频教程

共22课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn