一:緩存組件配置
在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]);
},
],
]);
}