yii2 快取機制

pardon110發表於2019-07-24

Yii2 支援資料,片段,頁面服務端快取機制,也支援實現客戶端的 http 快取機制

資料快取

  • 定義 將一些 PHP 變數儲存到快取中,使用時再從快取中取回
  • 快取元件
    • 快取元件通常註冊為應用程式元件,比如實現 yii\caching\MemCache
    • 資料快取需要快取元件提供支援,代表各種快取儲存器, 可以是記憶體,檔案,資料庫等
  • 快取資料
    • public mixed getOrSet ( $key, $callable, $duration = null, $dependency = null )
    • 簡化資料的取回、計算和儲存, 支援快取持續性和快取依賴
  • yiii2 支援的快取儲存器
    • yii\caching\ApcCache 使用 PHP APC 擴充套件,在集中式應用程式環境,單一伺服器
    • yii\caching\DbCache 資料庫的表儲存快取資料,需建相應的表
    • yii\caching\ArrayCache 將值儲存在陣列中來為當前請求提供快取
    • yii\caching\DummyCache 僅作為一個快取佔位符,應用在需要查詢快取有效性的程式碼
    • yii\caching\FileCache 檔案儲存快取資料,適合快取整頁的內容
    • yii\caching\MemCache 分散式應用環境,多臺伺服器,有負載均衡等
    • yii\redis\Cache 基於 Redis 鍵值對儲存器的快取元件
    • 應用場景
      • 基於記憶體的快取儲存器 儲存小而常用的資料 如統計資料
      • 基於檔案或資料庫的快取 儲存大而不太常用的資料 如網頁內容
  • 快取API簡介
    • 統一的基類 yii\caching\Cache, 實現了ArrayAccess 介面
    • 常用讀寫 get(),set(),add(),getOrSet()
      • add進行重複性檢查,即存在的資料不再進行快取
    • 多條目操作 multiGet(),multiSet(),multiAdd()
    • 其它 exists(),delete(),flush()
  • 快取鍵
    • 儲存在快取中的每項資料都透過鍵作唯一識別
    • 可透過 $keyPrefix屬性實現指定唯一字首,區分同一儲存器被應用於不同的應用場景
  • 快取過期
    • 預設永久存留,在某些策略下強制刪除
    • defaultDuration 屬性決定預設的快取持續時長
  • 快取依賴

    • 快取資料受超時設定外,還可能受到快取依賴的影響而失效(一個類,內建限制條件)
    • 快取依賴用 yii\caching\Dependency 的派生類表示
      • 呼叫 set() 在快取中儲存一項資料時,可傳遞一個關聯的快取依賴
    • 相關派生類簡介(不同的策略)
      • ChainedDependency 若依賴鏈上任何一個依賴產生變化,則依賴改變
      • DbDependency 若指定的sql查詢結果發生了變化,則依賴改變
      • ExpressionDependency PHP表示式結果發生變化,則依賴改變
      • FileDependency 檔案的最後修改時間發生變化,則依賴改變
      • TagDependency 將快取的資料與一個或多個標籤進行關聯
    • 查詢快取
      • 建立在資料快取之上的特殊快取特性,需要一個資料庫連線和一個有效的cache應用元件
        • User::find()->cache(7200)->all()
        • getDb()->cache(function ($db){...})
      • 配置
        • yii\db\Connection全域性可配置項
          • nableQueryCache 是否開啟或關閉查詢快取
          • queryCacheDuration 查詢結果在快取中保持有效的秒數 0為永久保留
          • queryCache 快取應用元件的 ID,預設為 'cache'
      • 使用
        • 快取的 SQL 查詢, yii\db\Connection::cache()
          • 基本原理 SQL 查詢的結果在快取中有效, 該SQl 語句將會被跳過而它的查詢結果會直接從快取中讀取
        • 不快取查詢 yii\db\Connection::noCache()
        • 使用單個查詢快取 構建命令時呼叫 yii\db\Command::cache() 同理支援noCache
      • 限制條件
        • 當查詢結果中含有資源控制程式碼時,查詢快取無法使用
        • 快取儲存器有大小限制,超過時會導致快取失敗
    • 快取沖刷

      • yii\caching\Cache::flush()
      • 或使用命令
        • yii cache
        • yii cache/flush-all
        • yii cache/flush-schema db 清除給定連線元件的資料庫表結構快取

片段快取(與檢視相關)

  • 快取頁面內容中的某個片段,片段快取基於資料快取實現

    • 在檢視類中使用 $this->beginCache($id) ... $this->endCache()形式
    • $id 為片段快取的全域性唯一標記,應用在檢視上
  • 快取選項

    • 向 beginCache() 方法第二個引數傳遞配置陣列
    • 在框架內部,該陣列將被用來配置一個 yii\widget\FragmentCache 小部件用以實現片段快取功能
  • 過期時間

    • 配置選項就是 duration 指定內容被快取的秒數
  • 片段快取依賴(類似於快取策略)

    • 如一段被快取的文章,是否重新快取取決於它是否被修改過
    • 透過設定 dependency 選項來指定依賴,可以是快取依賴的派生類,亦可以是建立快取物件的配置陣列
  • 變化 透過設定 variations 選項來指定變化

  • 開關 enabled 選項來指定快取開關

  • 快取巢狀

    • 外層的失效時間應該短於內層,外層的依賴條件應該低於內層,以確保最小的片段,返回的是最新的資料
  • 動態內容

    • 適合解決的問題
      • 一大段較為靜態的內容中有少許動態內容的情況
      • 快取的內容可能包含每次請求 都需要執行的 PHP 程式碼
    • 解決方案
      • 在片段快取中呼叫 yii\base\View::renderDynamic() 去插入動態內容

頁面快取

  • 伺服器端快取整個頁面的內容,當同一個頁面被請求時,內容將從快取中取出,而非重新生成
  • 由 yii\filters\PageCache 類提供支援,該類是一個過濾器
  • 支援 duration,dependencies,variations 和 enabled 配置選項
  • 頁面快取是由過濾器實現,而片段快取則是一個小部件

HTTP 快取

  • 目的 利用客戶端快取去節省相同頁面內容的生成和傳輸時間
  • 實施 配置 yii\filters\HttpCache 過濾器,控制器操作渲染的內容就能快取在客戶端
    • HttpCache 過濾器僅對 GET 和 HEAD 請求生效,設定與快取有關的http頭
  • Last-Modified
    • 配置 yii\filters\HttpCache::$lastModified 屬性向客戶端傳送 Last-Modified 頭
    • PHP callable 型別,返回的是頁面修改時的 Unix 時間戳, 簽名 function ($action, $params)
  • Etag
    • 使用一個雜湊值表示頁面內容。如果頁面被修改過, 雜湊值也會隨之改變
    • 原理 比對客戶端與服務端雜湊值,決定是否應該重新傳輸內容
    • 配置 yii\filters\HttpCache::$etagSeed 屬性向客戶端傳送 ETag 頭
    • 同理,值為可呼叫物件,返回生成的 Etag 值的雜湊值
  • ETag vs Last-Modified
    • 前者比後者能實現更復雜和精確的快取策略,如站點切換主題可使 ETag 失效
  • Cache-Control 頭
    • 指定了頁面的常規快取策略
    • 可配置 yii\filters\HttpCache::$cacheControlHeader屬性傳送相應的頭資訊
    • 預設傳送 Cache-Control: public, max-age=3600
  • 會話快取限制器
    • 頁面使 session 時,PHP 將會按照 PHP.INI 中所設定的 session.cache_limiter 值自動傳送一些快取相關的 HTTP 頭
    • 預設情況下 HttpCache 禁止自動傳送這些頭,但可配置 yii\filters\HttpCache::$sessionCacheLimiter進行設定
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章