搜索
首页后端开发php教程如何使用yii2的缓存依赖特性(代码示例)

本篇文章给大家带来的内容是关于如何使用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() 来检查指定标签的缓存数据项是否有效。

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

<?php
namespace frontend\controllers;
use yii\web\Controller;
class IndexController extends Controller
{
    public function behaviors()
    {
        return [
            [
                &#39;class&#39; => &#39;yii\filters\PageCache&#39;,
                &#39;only&#39; => [&#39;index&#39;],
                &#39;duration&#39; => 60,
                &#39;variations&#39; => [
                    \Yii::$app->language,
                ],
                &#39;dependency&#39; => [
                    &#39;class&#39; => &#39;yii\caching\DbDependency&#39;,
                    &#39;sql&#39; => &#39;SELECT COUNT(*) FROM post&#39;,
                ],
            ],
        ];
    }

    public function actionIndex()
    {
        return $this->render(&#39;index&#39;);
    }
    
}

如代码所示,在行为方法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 [
            &#39;pageCache&#39; => [
                &#39;class&#39; => &#39;yii\filters\PageCache&#39;,
                &#39;only&#39; => [&#39;index&#39;],
                &#39;duration&#39; => 24 * 3600 * 365, // 1 year
                &#39;variations&#39; => [
                    \Yii::$app->language,
                    \Yii::$app->id
                ],
                &#39;dependency&#39; => [
                    &#39;class&#39; => &#39;yii\caching\ChainedDependency&#39;,
                    &#39;dependencies&#39; => [
                        new \yii\caching\DbDependency([&#39;sql&#39; => &#39;SELECT MAX(updated_at) FROM post&#39;]),
                        new \yii\caching\DbDependency([&#39;sql&#39; => &#39;SELECT COUNT(id) FROM post&#39;]),
                        new \yii\caching\DbDependency([&#39;sql&#39; => &#39;SELECT MAX(updated_at) FROM category&#39;]),
                        new \yii\caching\DbDependency([&#39;sql&#39; => &#39;SELECT COUNT(id) FROM category&#39;]),
                        new \yii\caching\ExpressionDependency([&#39;expression&#39;=>&#39;\Yii::$app->request->get("id")&#39;]);
                        new \yii\caching\FileDependency([&#39;fileName&#39;=>&#39;yanying.txt&#39;]);
                    ]
                ],
            ],
        ];
    }

    public function actionIndex()
    {
        return $this->render(&#39;index&#39;);
    }
    
}

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

总结

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

以上是如何使用yii2的缓存依赖特性(代码示例)的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:博客园。如有侵权,请联系admin@php.cn删除
您如何防止与会议有关的跨站点脚本(XSS)攻击?您如何防止与会议有关的跨站点脚本(XSS)攻击?Apr 23, 2025 am 12:16 AM

要保护应用免受与会话相关的XSS攻击,需采取以下措施:1.设置HttpOnly和Secure标志保护会话cookie。2.对所有用户输入进行输出编码。3.实施内容安全策略(CSP)限制脚本来源。通过这些策略,可以有效防护会话相关的XSS攻击,确保用户数据安全。

您如何优化PHP会话性能?您如何优化PHP会话性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显着提升应用在高并发环境下的效率。

什么是session.gc_maxlifetime配置设置?什么是session.gc_maxlifetime配置设置?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceIsiseededeedeedeedeedeedeedto to to avoidperformance andununununununexpectedLogOgouts.3)

您如何在PHP中配置会话名?您如何在PHP中配置会话名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函数配置会话名称。具体步骤如下:1.使用session_name()函数设置会话名称,例如session_name("my_session")。2.在设置会话名称后,调用session_start()启动会话。配置会话名称可以避免多应用间的会话数据冲突,并增强安全性,但需注意会话名称的唯一性、安全性、长度和设置时机。

您应该多久再生一次会话ID?您应该多久再生一次会话ID?Apr 23, 2025 am 12:03 AM

会话ID应在登录时、敏感操作前和每30分钟定期重新生成。1.登录时重新生成会话ID可防会话固定攻击。2.敏感操作前重新生成提高安全性。3.定期重新生成降低长期利用风险,但需权衡用户体验。

如何在PHP中设置会话cookie参数?如何在PHP中设置会话cookie参数?Apr 22, 2025 pm 05:33 PM

在PHP中设置会话cookie参数可以通过session_set_cookie_params()函数实现。1)使用该函数设置参数,如过期时间、路径、域名、安全标志等;2)调用session_start()使参数生效;3)根据需求动态调整参数,如用户登录状态;4)注意设置secure和httponly标志以提升安全性。

在PHP中使用会议的主要目的是什么?在PHP中使用会议的主要目的是什么?Apr 22, 2025 pm 05:25 PM

在PHP中使用会话的主要目的是维护用户在不同页面之间的状态。1)会话通过session_start()函数启动,创建唯一会话ID并存储在用户cookie中。2)会话数据保存在服务器上,允许在不同请求间传递数据,如登录状态和购物车内容。

您如何在子域中分享会议?您如何在子域中分享会议?Apr 22, 2025 pm 05:21 PM

如何在子域名间共享会话?通过设置通用域名的会话cookie实现。1.在服务器端设置会话cookie的域为.example.com。2.选择合适的会话存储方式,如内存、数据库或分布式缓存。3.通过cookie传递会话ID,服务器根据ID检索和更新会话数据。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。