動態

詳情 返回 返回

Yii緩存機制yii\caching\Cache - 動態 詳情

一:緩存組件配置

在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]);
            },
        ],
    ]);
}
user avatar yanwushu 頭像 shuyixiaobututou 頭像
點贊 2 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.