Yii 緩存詳解

以前我已經簡單的記錄過在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]);
            },
        ]
    ];
}
相關文章
相關標籤/搜索