当前位置:首页 > PHP教程 > php应用 > 列表

如何使用yii2的缓存依赖特性(代码示例)

发布:smiling 来源: PHP粉丝网  添加日期:2020-01-10 17:33:29 浏览: 评论:0 

本篇文章给大家带来的内容是关于如何使用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中,声明依赖关系:

  1. <?php 
  2.  
  3. namespace frontend\controllers; 
  4.  
  5. use yii\web\Controller; 
  6.  
  7. class IndexController extends Controller 
  8.  
  9.  
  10.     public function behaviors() 
  11.  
  12.     { 
  13.  
  14.         return [ 
  15.  
  16.             [ 
  17.  
  18.                 'class' => 'yii\filters\PageCache'
  19.  
  20.                 'only' => ['index'], 
  21.  
  22.                 'duration' => 60, 
  23.  
  24.                 'variations' => [ 
  25.  
  26.                     \Yii::$app->language, 
  27.  
  28.                 ], 
  29.  
  30.                 'dependency' => [ 
  31.  
  32.                     'class' => 'yii\caching\DbDependency'
  33.  
  34.                     'sql' => 'SELECT COUNT(*) FROM post'
  35.  
  36.                 ], 
  37.  
  38.             ], 
  39.  
  40.         ]; 
  41.  
  42.     } 
  43.  
  44.  
  45. //phpfensi.com 
  46.     public function actionIndex() 
  47.  
  48.     { 
  49.  
  50.         return $this->render('index'); 
  51.  
  52.     } 
  53.  
  54.       
  55.  

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

链式依赖

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

所谓链式依赖,就是将缓存依赖关系配置到一个链中,一旦链中某个关系不成立,就会刷新缓存。

其中yii\caching\ChainedDependency就是缓存依赖的主要实现类。实现代码如下所示:

  1. <?php 
  2.  
  3. namespace frontend\controllers; 
  4.  
  5. use yii\web\Controller; 
  6.  
  7. class IndexController extends Controller 
  8.  
  9.  
  10.     public function behaviors() 
  11.  
  12.     { 
  13.  
  14.         return [ 
  15.  
  16.             'pageCache' => [ 
  17.  
  18.                 'class' => 'yii\filters\PageCache'
  19.  
  20.                 'only' => ['index'], 
  21.  
  22.                 'duration' => 24 * 3600 * 365, // 1 year 
  23.  
  24.                 'variations' => [ 
  25.  
  26.                     \Yii::$app->language, 
  27.  
  28.                     \Yii::$app->id 
  29.  
  30.                 ], 
  31.  
  32.                 'dependency' => [ 
  33.  
  34.                     'class' => 'yii\caching\ChainedDependency'
  35.  
  36.                     'dependencies' => [ 
  37.  
  38.                         new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM post']), 
  39.  
  40.                         new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(id) FROM post']), 
  41.  
  42.                         new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM category']), 
  43.  
  44.                         new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(id) FROM category']), 
  45.  
  46.                         new \yii\caching\ExpressionDependency(['expression'=>'\Yii::$app->request->get("id")']); 
  47.  
  48.                         new \yii\caching\FileDependency(['fileName'=>'yanying.txt']); 
  49.  
  50.                     ] 
  51.  
  52.                 ], 
  53.  
  54.             ], 
  55.  
  56.         ]; 
  57.  
  58.     } 
  59.  
  60.  
  61. //phpfensi.com 
  62.     public function actionIndex() 
  63.  
  64.     { 
  65.  
  66.         return $this->render('index'); 
  67.  
  68.     } 
  69.  
  70.       
  71.  

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

总结:

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

Tags: yii2缓存依赖特性

分享到: