以前我已經簡單的記錄過在Yii中的緩存使用,這裏我來詳細的介紹下在Yii中的緩存使用php
在yii中緩存一共分爲四種,分別爲數據緩存,片斷緩存,頁面緩存,HTTP緩存html
在Yii中使用緩存以前,首先在配置文件main.php文件中配置緩存組件sql
一:緩存組件配置數據庫
'components' => [ 'cache' => [ 'class' => 'yii\caching\FileCache', //緩存目錄 'cachePath' => '@common/runtime' ], ]
在Yii中有多種緩存方式,上面的是文件存儲緩存,常見一共有三種,除了上面的文件存儲類緩存以外,還有使用php的APC拓展緩存和使用數據庫存儲緩存數組
使用php的APC拓展緩存配置:瀏覽器
'components' => [ 'cache' => [ 'class' => 'yii\caching\ApcCache', ], ]
使用數據庫存儲緩存配置:緩存
'components' => [ 'cache' => [ 'class' => 'yii\caching\DbCache', ], ]
若是使用數據庫存儲緩存的話,這時候須要在數據庫中建立一個緩存表cache,在這裏咱們可使用Yii自帶的migrations工具生成緩存表,migrations使用方式參考: https://www.wj0511.com/site/detail.html?id=294服務器
生成緩存表的migrate:app
/** * {@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}}'); }
這裏注意:因爲data字段是blob類型,yii框架沒有生成blob類型的方法,你須要本身進行設置blob類型框架
$this->getDb()->getSchema()->createColumnSchemaBuilder('字段類型')
二:數據緩存
數據緩存是指將一些 PHP 變量存儲到緩存中,使用時再從緩存中取回
1:數據緩存的獲取和設置
在Yii中使用數據緩存以下:
$cache = Yii::$app->cache; $key = 'key';//緩存ID $data = $cache->get($key); if ($data === false) { $data = '須要緩存的數據'; // 將 $data 存放到緩存供下次使用 $cache->set($key, $data); }
如上代碼表示:首先判斷緩存數據中是否有緩存ID爲key的緩存數據,若是有直接獲取緩存中的數據,若是沒有則執行set方法將數據加入到緩存中,並返回緩存數據
將數據加入到緩存中的set方法一共有四個參數,語法結構以下
$cache->set($key, $value, $duration = null, $dependency = null);
參數說明:
key:緩存ID,爲必填項
value:須要緩存的數據,爲必填項
duration:緩存過時時間參數,該參數表示緩存數據可保持的有效時間(單位爲秒),爲非必填項
dependency:緩存依賴參數,如當一個緩存數據的緩存依賴信息發生了變化以後,這時候緩存數據就會被設爲失效,及過時
如:
$cache = Yii::$app->cache; // 建立一個對 test.txt文件修改時間的緩存依賴 $dependency = new \yii\caching\FileDependency(['fileName' => 'test.txt']); $cache->set($key, $data, null, $dependency);
如上設置了一個緩存數據,當test.txt文件被修改的話,這時候的緩存數據就會被設爲失效,及過時
常見的緩存依賴能夠參考Yii框架的官網,這裏不進行過多的敘述了
2:清除緩存
既然有設置緩存,那麼必定有清除緩存
(1)清除指定緩存ID的緩存數據
$cache = Yii::$app->cache; $cache->delete($key);
(2)清除全部緩存數據
$cache = Yii::$app->cache; $cache->flush();
3:查詢緩存
有時候咱們在查詢數據庫的數據時,此數據基本上很長數據都不會發生變化,這時候咱們就可使用查詢緩存來緩存數據庫的查詢結果提升效率
查詢緩存兩種方式:使用yiidbConnection實例來實現查詢緩存和使用模型實現查詢緩存
(1)使用yiidbConnection實例來實現查詢緩存
$db = Yii::$app->db; $result = $db->cache(function ($db) { // SQL查詢的結果將從緩存中提供 // 若是啓用查詢緩存而且在緩存中找到查詢結果 return $db->createCommand('SELECT * FROM yii_user WHERE id=1')->queryOne(); });
如上將SELECT * FROM yii_user WHERE id=1的結果進行緩存
(2):使用模型實現查詢緩存
$result = User::getDb()->cache(function ($db) { return User::findOne(1); });
如上將User::findOne(1)查詢的結果進行緩存
上面的cache方法一共有三個參數
cache(callable $callable, $duration = null, $dependency = null)
參數說明:
callable:匿名函數,須要緩存的sql查詢數據
duration,dependency參數可查看上面的說明
三:片斷緩存
片斷緩存指的是緩存頁面內容中的某個片斷,如:在html中,你想要將一段html片斷緩存起來,避免每次請求都從新生成此段html片斷,這時候就可使用片斷緩存
實例:
<?php if ($this->beginCache('key')):?> <span>html片斷</span> <?php $this->endCache(); endif; ?>
如上就將<span>html片斷</span>片斷進行了緩存
beginCache方法參數說明:
beginCache($id, $properties = [])
$id:緩存Id
$properties:緩存配置數組,緩存數組中常見的配置參數有:duration(緩存過時事件,單位爲秒),dependency(緩存依賴),enabled(開關,默認爲true,表示開啓緩存,false爲關閉緩存)
如:
$dependency = [ 'class' => 'yii\caching\DbDependency', 'sql' => 'SELECT MAX(updated_time) FROM user', ]; if ($this->beginCache('key',[ 'duration' => 3600,//設置緩存過時時間爲3600秒, 'dependency' => $dependency,//設置緩存依賴,當user表中的update_time字段值發生變化,緩存失效,從新進行緩存 'enabled' => Yii::$app->request->isGet,//當爲get請求開啓緩存,非get請求則關閉緩存 ])) { // ... 在今生成內容 ... $this->endCache(); }
四:頁面緩存
頁面緩存指的是在服務器端緩存整個頁面的內容。 隨後當同一個頁面被請求時,內容將從緩存中取出,而不是從新生成
頁面緩存由 yiifiltersPageCache 類提供支持,這個類是一個過濾器,因此若是你須要使用頁面緩存,只須要在控制器的behaviors方法中引入yiifiltersPageCache類便可
如:
public function behaviors() { return [ [ 'class' => 'yii\filters\PageCache', //只有在執行page操做時啓用緩存 'only' => ['page'], //緩存過時時間爲60秒 'duration' => 60, //當user表中的數據總數發生變化時頁面緩存失效,從新進行緩存 'dependency' => [ 'class' => 'yii\caching\DbDependency', 'sql' => 'SELECT COUNT(*) FROM user', ], ], ]; }
五:HTTP緩存
前面講到的緩存都是服務端緩存,在Yii中還可使用客戶端緩存去節省相同頁面內容的生成和傳輸時間,及HTTP緩存
HTTP緩存使用到了yiifiltersHttpCache類,這個類也是一個過濾器,因此你要使用HTTP緩存,及在控制器的behaviors方法中引入yiifiltersHttpCache類
HTTP緩存能夠設置與緩存有關的HTTP頭
1:Last-Modified 頭
經過配置yiifiltersHttpCache::$lastModified屬性向客戶端發送Last-Modified 頭
如:
public function behaviors() { return [ [ 'class' => 'yii\filters\HttpCache', //只有在執行index操做時啓用HTTP緩存 'only' => ['page'], //基於頁面最後修改時間生成一個Last-Modified的HTTP頭,當user數據發生變化,HTTP緩存失效,從新生成緩存 'lastModified' => function ($action, $params) { $query = new \yii\db\Query(); return $query->from('user')->max('updated_time'); }, ] ]; }
2:ETag 頭
ETag使用一個哈希值表示頁面內容。若是頁面被修改過, 哈希值也會隨之改變。經過對比客戶端的哈希值和服務器端生成的哈希值, 瀏覽器就能判斷頁面是否被修改過,進而決定是否應該從新傳輸內容,經過配置 yiifiltersHttpCache::$etagSeed 屬性向客戶端發送 ETag 頭
如:
public function behaviors() { return [ [ 'class' => 'yii\filters\HttpCache', //只有在執行view操做時啓用HTTP緩存 'only' => ['view'], //基於用戶請求的username和password生成一個 ETag的HTTP頭,當username和password數據被修改的話,緩存失效,從新生成緩存 'etagSeed' => function ($action, $params) { $user = User::findOne(\Yii::$app->request->get('id')); return serialize([$user->username, $user->password]); }, ] ]; }