婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP之深入學習Yii2緩存Cache組件詳細講解

PHP之深入學習Yii2緩存Cache組件詳細講解

熱門標簽:天津電銷外呼系統違法嗎 上海400客服電話怎么申請 手機外呼系統什么原理 400電話個人能不能辦理 滄州電銷外呼系統價格 合肥ai電銷機器人費用 溫州外呼系統招商 凱立德地鐵站地圖標注 銀行信貸電話機器人

什么是緩存組件Cache

緩存是提升 Web 應用性能簡便有效的方式。 通過將相對靜態的數據存儲到緩存并在收到請求時取回緩存, 應用程序便節省了每次重新生成這些數據所需的時間。

定義緩存組件

Yii2的緩存是通過組件Component實現的,在項目的配置文件中,配置components->cache實現對緩存組件的定義。

項目配置文件的路徑為config/web.php。

頁面緩存PageCache

作為網站來講,Yii2的頁面緩存非常便捷地將已經渲染完全的網頁結果保存起來,并在一個緩存周期內不需要再次處理頁面內部的控制器動作邏輯。

配置頁面緩存

頁面緩存的配置方式為,在控制器層Controller中配置行為behaviors,通過調用過濾器filters的方式,在進入具體頁面路徑action的之前,對當前key進行計算,并判斷緩存是否啟用enabled緩存有效期duration。

基礎配置代碼如下所示

        return [
            'pageCache' => [
                'class' => 'yii\filters\PageCache',
                'only' => ['index'],
                'variations' => [
                    '/',
                    Yii::$app->request->isAjax,
                ],
                'enabled'=>true,
                'duration' => Yii::$app->params['pageCacheDuration'],
            ],
        ];

過濾器是Yii2中的一個概念,他可以在控制器初始化的時候加載并執行,我們可以用這個特點去做一些對控制器的數據的限制,比如控制緩存、用戶權限控制。

這里我們將行為名稱定義為pageCache,顯然名字不重要,因為有的案例中,因為不同的頁面緩存規則不一樣,我會定義兩個頁面緩存的行為。

其中only為過濾器調用action的參數,用于限制哪些路徑是啟用action的。

頁面緩存PageCache是緩存組件Cache的一種應用

頁面緩存的根本邏輯為

  1. 配置緩存組件的實現比如文件緩存yii\caching\FileCache
  2. 頁面緩存封裝一層Cache組件,再去調用存取邏輯

我們可以通過查看頁面緩存源碼vendor/yiisoft/yii2/filters/PageCache.php,我們可以在文件的第162行發現,這里調用的cache,就是對于緩存的實現。

$this->cache = Instance::ensure($this->cache, 'yii\caching\CacheInterface');

自定義頁面緩存過濾器

為什么我們需要自定義緩存組件呢,我歸納原因存在以下幾種

  • 緩存判斷邏輯過于簡單或復雜,不如自己重寫痛快地多
  • 緩存key生成方式不滿足業務需求

那么如何自定義呢?我個人推薦最簡單粗暴的方式,繼承。

use yii\filters\PageCache;

class PageCacheCtInfo extends PageCache
{
	這里是內部邏輯,不需要重寫的方法可以不寫。
	public $checkUser = true; //可以自定義變量
}

調用方式也是跟默認的頁面緩存一樣,只要換上對應的類即可。

            'pageCacheInfo' => [
                'class' => 'common\components\PageCacheCtInfo',
                'only' => ['info'],
                'enabled'=>Yii::$app->params['pageCacheEnabled'],
                'variations' => [
                    'ct/'.Yii::$app->request->pathInfo,
                    Yii::$app->request->isAjax
                ],
                'duration' => Yii::$app->params['pageCacheInfo'],
                'checkUser' = false,
            ],

頁面緩存key的計算

根據上一個步驟,我們可以重寫計算key的方式,那么之前的key計算方式是什么樣的呢?

文件位置vendor/yiisoft/yii2/filters/PageCache.php。

    /**
     * @return array the key used to cache response properties.
     * @since 2.0.3
     */
    protected function calculateCacheKey()
    {
        $key = [__CLASS__];
        if ($this->varyByRoute) {
            $key[] = Yii::$app->requestedRoute;
        }
        return array_merge($key, (array)$this->variations);
    }

這里的緩存key是一個數組,數組內的元素依次是

  • 當前類名
  • varyByRoute 一般為true
  • variations 驗證,這個也是配置中獲取的,根據上面的配置,則是頁面路徑和是否為ajax

如果是項目的首頁,緩存的key則為

['yii\filters\PageCache','','/‘,0]

如果是個詳情頁面,key為

['yii\filters\PageCach', 'xxx/info','xxx/xxx/3xxxx74.html',0 ]

那么,這個key到底有什么用,為什么要單獨拿出來說呢?

因為我們需要單獨刪除某個頁面緩存。

主動清理過期緩存

根據源碼vendor/yiisoft/yii2/caching/FileCache.php

    /**
     * Stores a value identified by a key in cache.
     * This is the implementation of the method declared in the parent class.
     *
     * @param string $key the key identifying the value to be cached
     * @param string $value the value to be cached. Other types (If you have disabled [[serializer]]) unable to get is
     * correct in [[getValue()]].
     * @param int $duration the number of seconds in which the cached value will expire. 0 means never expire.
     * @return bool true if the value is successfully stored into cache, false otherwise
     */
    protected function setValue($key, $value, $duration)
    {
        $this->gc();
        $cacheFile = $this->getCacheFile($key);
        if ($this->directoryLevel > 0) {
            @FileHelper::createDirectory(dirname($cacheFile), $this->dirMode, true);
        }
        // If ownership differs the touch call will fail, so we try to
        // rebuild the file from scratch by deleting it first
        // https://github.com/yiisoft/yii2/pull/16120
        if (is_file($cacheFile)  function_exists('posix_geteuid')  fileowner($cacheFile) !== posix_geteuid()) {
            @unlink($cacheFile);
        }
        if (@file_put_contents($cacheFile, $value, LOCK_EX) !== false) {
            if ($this->fileMode !== null) {
                @chmod($cacheFile, $this->fileMode);
            }
            if ($duration = 0) {
                $duration = 31536000; // 1 year
            }

            return @touch($cacheFile, $duration + time());
        }

        $error = error_get_last();
        Yii::warning("Unable to write cache file '{$cacheFile}': {$error['message']}", __METHOD__);
        return false;
    }

在設置緩存之前會主動調用清理緩存的方法gc()

    /**
     * Removes expired cache files.
     * @param bool $force whether to enforce the garbage collection regardless of [[gcProbability]].
     * Defaults to false, meaning the actual deletion happens with the probability as specified by [[gcProbability]].
     * @param bool $expiredOnly whether to removed expired cache files only.
     * If false, all cache files under [[cachePath]] will be removed.
     */
    public function gc($force = false, $expiredOnly = true)
    {
        if ($force || mt_rand(0, 1000000)  $this->gcProbability) {
            $this->gcRecursive($this->cachePath, $expiredOnly);
        }
    }

這里問題就出現了,$gcProbability的默認值是10,也就是說,只有0.001%的概率會在設置緩存的同時清理過期緩存。

這不就跟沒有一樣!

所以對于緩存來說,需要我們主動定期清理過期緩存,不然對應的存儲空間就會被占滿。

Yii::$app->cache->gc(true);

優化緩存配置

組件的cache在項目的配置文件中定義

'components' => ['cache' => [
    'class' => 'yii\caching\FileCache',
],],

這里的自由度就出現了,現在這個配置,是文件緩存,也就是不管是數據緩存還是頁面緩存,都是保存在文件里的

根據源碼 public $cachePath = '@runtime/cache';

緩存的文件是放在runtime/cache文件夾的

那么問題就出現了,磁盤的性能是有瓶頸的,文件讀寫會影響緩存性能。

目前可選的緩存有

  • yii\caching\ApcCache,APC擴展
  • yii\caching\DbCache,數據庫緩存
  • yii\caching\DummyCache,假的緩存,就是現在沒條件上緩存先把坑占上
  • yii\caching\FileCache,文件緩存
  • yii\caching\MemCache,使用 PHP memcache 和 memcached 擴展
  • yii\redis\Cache,redis
  • yii\caching\WinCache,使用 PHP WinCache 擴展
  • yii\caching\XCache,使用 PHP XCache擴展
  • yii\caching\ZendDataCache,使用Zend Data Cache

總結

我在本文中,通過漸進的方式,講了如何使用Yii2的緩存組件,對于一般的使用者來講,已經涵蓋了超過九成的坑。

如果你正在學習PHP,希望你收藏這篇文章,這會對你以后有所幫助。

到此這篇關于PHP之深入學習Yii2緩存Cache組件詳細講解的文章就介紹到這了,更多相關PHP之深入學習Yii2緩存Cache組件內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Android基于SoftReference緩存圖片的方法
  • Java jvm中Code Cache案例詳解
  • Java reservedcodecachesize虛擬機參數案例詳解
  • 解析springboot整合谷歌開源緩存框架Guava Cache原理
  • 解決@Cacheable在同一個類中方法調用不起作用的問題
  • java中Memcached的使用實例(包括與Spring整合)
  • PHP解決高并發問題(opcache)
  • Java SoftReference類案例詳解

標簽:溫州 白城 酒泉 金華 七臺河 赤峰 洛陽 怒江

巨人網絡通訊聲明:本文標題《PHP之深入學習Yii2緩存Cache組件詳細講解》,本文關鍵詞  PHP,之,深入,學習,Yii2,緩存,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP之深入學習Yii2緩存Cache組件詳細講解》相關的同類信息!
  • 本頁收集關于PHP之深入學習Yii2緩存Cache組件詳細講解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产乱一区二区| 麻豆91在线观看| 欧美色欧美亚洲另类二区| 在线成人av网站| 日韩va欧美va亚洲va久久| 99热这里都是精品| 国产精品素人一区二区| 成人app软件下载大全免费| 国产精品久久三区| 欧美三级资源在线| 青青草国产成人av片免费| 日韩一级成人av| 国精产品一区一区三区mba视频| 精品免费一区二区三区| 成人免费不卡视频| 亚洲综合激情另类小说区| 欧美卡1卡2卡| 奇米亚洲午夜久久精品| 91精品国产综合久久精品app| 亚洲h精品动漫在线观看| 2024国产精品| 欧美精品久久99久久在免费线| 国产成人免费视频网站 | 日韩精品福利网| 久久亚洲欧美国产精品乐播| 欧美亚洲日本一区| 丰满亚洲少妇av| 精品一区二区三区的国产在线播放| 中文字幕佐山爱一区二区免费| 欧美日本一区二区三区四区| 成人av免费在线| 粉嫩欧美一区二区三区高清影视 | 久久久久久一级片| 97精品电影院| 国产+成+人+亚洲欧洲自线| 久久国产视频网| 久久精工是国产品牌吗| 青草国产精品久久久久久| 亚洲在线成人精品| 亚洲最大色网站| 亚洲欧美视频在线观看视频| 亚洲综合一区二区| 国产精品久久久久久久久免费樱桃| 亚洲女同女同女同女同女同69| 久久久91精品国产一区二区精品| 欧美一级理论片| 久久久久久久综合| 国产精品麻豆久久久| 国产精品久久福利| 国产精品久线在线观看| 久久一留热品黄| 精品日韩一区二区三区| 欧美激情综合网| 亚洲国产婷婷综合在线精品| 精品粉嫩aⅴ一区二区三区四区| 欧美日韩高清不卡| 欧美男女性生活在线直播观看| 欧美久久久久久久久久| 精品国产亚洲一区二区三区在线观看| 精品国产成人在线影院| 欧美国产精品一区二区| 亚洲精品乱码久久久久久| 香港成人在线视频| 精品亚洲国内自在自线福利| 色综合久久久久久久久久久| 精品人在线二区三区| 亚洲在线视频一区| av影院午夜一区| 欧美一级片在线看| 国产精品麻豆一区二区| 精品夜夜嗨av一区二区三区| 91久久线看在观草草青青| 91精品国产综合久久香蕉的特点 | 成人午夜视频网站| 亚洲成人免费观看| 大白屁股一区二区视频| 欧美成人精品3d动漫h| 午夜欧美一区二区三区在线播放| 国产精品99精品久久免费| 久久综合色8888| 国产精品自产自拍| 国产精品萝li| 色综合天天综合给合国产| 1024成人网色www| 欧美亚洲日本一区| 视频一区二区国产| 精品欧美乱码久久久久久1区2区| 毛片av一区二区| 国产免费观看久久| 91福利视频久久久久| 男女男精品视频网| 亚洲国产高清不卡| 欧美色精品在线视频| 蜜臀av一级做a爰片久久| 久久久九九九九| 色999日韩国产欧美一区二区| 亚洲五码中文字幕| 国产欧美日韩不卡免费| 欧美日韩中文一区| 99久久久国产精品免费蜜臀| 日韩有码一区二区三区| 亚洲欧洲成人自拍| 久久久99精品免费观看| 一本到不卡精品视频在线观看| 日本不卡123| 亚洲激情图片一区| 中文字幕不卡在线观看| 欧美不卡一区二区三区| 日韩欧美一级片| 精品欧美一区二区久久| 色综合久久久久综合体| 日本免费在线视频不卡一不卡二 | 色美美综合视频| 黄色精品一二区| 亚洲国产中文字幕| 亚洲精品乱码久久久久久黑人| 国产日韩一级二级三级| 久久女同性恋中文字幕| 欧美电影免费观看高清完整版在线 | 国内精品国产成人国产三级粉色| 亚洲女人的天堂| 亚洲精品国产a久久久久久 | 精品午夜久久福利影院| 亚洲电影中文字幕在线观看| 亚洲人快播电影网| 欧美激情一区二区三区蜜桃视频 | 欧美视频在线一区二区三区| eeuss国产一区二区三区| 成人午夜av电影| 日本精品视频一区二区三区| 欧美日本免费一区二区三区| 日韩精品一区二区三区中文不卡| 久久蜜臀中文字幕| 亚洲色图欧洲色图婷婷| 精品午夜久久福利影院 | 一区二区三区中文字幕电影| 日韩极品在线观看| 国产成人精品www牛牛影视| 99久久精品国产麻豆演员表| 欧美精品欧美精品系列| 国产免费观看久久| 久久99国内精品| 精品视频全国免费看| 亚洲欧洲性图库| 精品一区在线看| 欧美欧美午夜aⅴ在线观看| 国产精品区一区二区三| 美日韩一区二区| 91精品91久久久中77777| 国产欧美日韩在线| 国产盗摄视频一区二区三区| 2014亚洲片线观看视频免费| 亚洲蜜臀av乱码久久精品| 国产在线精品国自产拍免费| 99精品视频中文字幕| 久久久久国产一区二区三区四区| 亚洲成人免费在线观看| 欧美日韩激情一区二区三区| 亚洲老司机在线| 欧美视频精品在线观看| 亚洲成a人在线观看| 欧美日本一区二区| 久久成人综合网| 国产人久久人人人人爽| 色婷婷亚洲综合| 奇米精品一区二区三区在线观看一| 97久久超碰国产精品电影| **性色生活片久久毛片| 色婷婷综合久久久中文一区二区 | 成人国产精品免费观看| 一区二区三区在线不卡| 日韩欧美高清dvd碟片| 国产成人高清视频| 午夜久久久久久| 中文一区二区在线观看| 欧洲精品视频在线观看| 精品一区二区在线看| 亚洲一区二区三区四区五区中文| 日韩一区二区三区观看| 色屁屁一区二区| 国产夫妻精品视频| 狠狠色丁香婷婷综合| 偷偷要91色婷婷| 亚洲人成伊人成综合网小说| 精品成人a区在线观看| 欧美日韩精品免费| 在线观看视频一区二区欧美日韩| 国产精品一区免费视频| 成人动漫一区二区在线| 一区二区三区中文字幕| 中文字幕免费观看一区| 精品久久久久久久一区二区蜜臀| 色婷婷精品大在线视频| 99免费精品在线观看| 国产麻豆精品theporn| 精品一区二区综合| 国内精品免费在线观看| 久久精品国产免费| 国产精品资源在线| 亚洲欧洲国产日本综合|