一:缓存组件配置
在Yii中常用的缓存方式有
- yii\caching\FileCache:文件缓存
- yii\caching\ApcCache:APC缓存,需要安装PHP的APC拓展
- yii\caching\DbCache:数据库缓存,需要创建一个缓存表
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->createTable('{{%cache}}', [
'id' => $this->char(128)->defaultValue('')->comment('缓存ID'),
'expire' => $this->integer()->defaultValue(0)->comment('到期时间'),
'data' => $this->getDb()->getSchema()->createColumnSchemaBuilder('blob')->comment('缓存数据'),
'PRIMARY KEY ([[id]], [[expire]])',
], 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB COMMENT=\'缓存表\'');
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropTable('{{%cache}}');
}
- yii\caching\MemCache:使用使用 PHP memcache 和 memcached 扩展进行缓存存储
- yii\redis\Cache:redis缓存,需要安装yiisoft/yii2-redis拓展
composer require yiisoft/yii2-redis
二:数据查询缓存
参考:https://www.yiichina.com/doc/guide/2.0/caching-data
数据查询缓存两种方式:使用yii\db\Connection实例来实现查询缓存和使用模型实现查询缓存
1:使用yii\db\Connection实例来实现查询缓存
$db = Yii::$app->db;
$result = $db->cache(function ($db) {
// SQL查询的结果将从缓存中提供
// 如果启用查询缓存并且在缓存中找到查询结果
return $db->createCommand('SELECT * FROM yii_user WHERE id=1')->queryOne();
});
2:使用模型实现查询缓存
$result = User::getDb()->cache(function ($db) {
return User::findOne(1);
});
上面的cache方法一共有三个参数
cache(callable $callable, $duration = null, $dependency = null)
自 2.0.14 以后,您可以使用以下快捷方法:
User::find()->cache(7200)->all();
上面的cache方法一共有两个参数
cache($duration = true, $dependency = null)
参数说明:
- callable:匿名函数,需要缓存的sql查询数据
- duration:缓存过期时间参数,该参数表示缓存数据可保持的有效时间(单位为秒),为非必填项
- dependency:缓存依赖参数,如当一个缓存数据的缓存依赖信息发生了变化之后,这时候缓存数据就会被设为失效,及过期
常用的缓存依赖有:
- yii\caching\ChainedDependency:如果依赖链上任何一个依赖产生变化,则依赖改变。
- yii\caching\DbDependency:如果指定 SQL 语句的查询结果发生了变化,则依赖改变。
- yii\caching\FileDependency:如果文件的最后修改时间发生变化,则依赖改变。
示例:
$result = User::find()->cache(100, new \yii\caching\ChainedDependency([
'dependencies' => [
new \yii\caching\DbDependency([
'sql' => 'SELECT MAX(update_time) FROM' . User::tableName()
]),
new \yii\caching\FileDependency([
'fileName' => 'text.txt'
]),
]
]))->count();
$result = User::find()->cache(100, new \yii\caching\DbDependency([
'sql' => 'SELECT MAX(update_time) FROM' . User::tableName()
]))->count();
$result = User::find()->cache(100, new \yii\caching\FileDependency([
'fileName' => 'text.txt'
]))->count();
三:片段缓存
参考:https://www.yiichina.com/doc/guide/2.0/caching-fragment
片段缓存指的是缓存页面内容中的某个片段,如:在html中,你想要将一段html片段缓存起来,避免每次请求都重新生成此段html片段,这时候就可以使用片段缓存
示例:
如下就将<span>html片段</span>片段进行了缓存
<?php if ($this->beginCache('key')):?>
<span>html片段</span>
<?php
$this->endCache();
endif;
?>
参数说明:
beginCache($id, $properties = [])
- $id:缓存Id
- $properties:缓存配置数组,缓存数组中常见的配置参数有:duration(缓存过期事件,单位为秒),dependency(缓存依赖),enabled(开关,默认为true,表示开启缓存,false为关闭缓存)
四:页面缓存
参考:https://www.yiichina.com/doc/guide/2.0/caching-page
页面缓存指的是在服务器端缓存整个页面的内容。 随后当同一个页面被请求时,内容将从缓存中取出,而不是重新生成,页面缓存由 yii\filters\PageCache 类提供支持,这个类是一个过滤器,所以如果你需要使用页面缓存,只需要在控制器的behaviors方法中引入yii\filters\PageCache类即可
示例:
/**
* 缓存过滤器
*/
public function behaviors()
{
return ArrayHelper::merge(parent::behaviors(), [
//内容将从缓存中取出进行渲染
'pageCache' => [
'class' => 'yii\filters\PageCache',
//执行index操作时启用缓存
'only' => ['index'],
//缓存过期时间为60秒
'duration' => 60,
//当考试和公告变换时,重新进行缓存
'dependency' => [
'class' => 'yii\caching\ChainedDependency',
'dependencies' => [
new \yii\caching\DbDependency([
'sql' => 'SELECT MAX(update_time) FROM ' . Exam::tableName() . ' WHERE status=' . Exam::STATUS_ENABLE
]),
new \yii\caching\DbDependency([
'sql' => 'SELECT MAX(update_time) FROM ' . ExamNotice::tableName() . ' WHERE status=' . ExamNotice::STATUS_ENABLE
]),
new \yii\caching\DbDependency([
'sql' => 'SELECT MAX(update_time) FROM ' . Content::tableName() . ' WHERE status=' . Content::STATUS_ENABLE
]),
]
],
],
]);
}
五:HTTP缓存
参考:https://www.yiichina.com/doc/guide/2.0/caching-http
前面讲到的缓存都是服务端缓存,在Yii中还可以使用客户端缓存去节省相同页面内容的生成和传输时间,即HTTP缓存,HTTP缓存使用到了yii\filters\HttpCache类,这个类也是一个过滤器,所以你要使用HTTP缓存,及在控制器的behaviors方法中引入yii\filters\HttpCache类,。 HttpCache 过滤器仅对 GET 和 HEAD 请求生效, 它能为这些请求设置三种与缓存有关的 HTTP 头:Last-Modified,Etag,Cache-Control
示例:
/**
* 缓存过滤器
*/
public function behaviors()
{
return ArrayHelper::merge(parent::behaviors(), [
'httpCache' => [
'class' => 'yii\filters\HttpCache',
//执行index操作时启用缓存
'only' => ['index'],
//当RTag头信息发生变化时, HTTP缓存失效,重新生成缓存
'etagSeed' => function ($action, $params) {
$page = Yii::$app->request->get('page');
return serialize([$page]);
},
],
]);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。