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
- 快取的 SQL 查詢,
- 限制條件
- 當查詢結果中含有資源控制程式碼時,查詢快取無法使用
- 快取儲存器有大小限制,超過時會導致快取失敗
- 建立在資料快取之上的特殊快取特性,需要一個資料庫連線和一個有效的cache應用元件
-
快取沖刷
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
進行設定
- 頁面使 session 時,PHP 將會按照 PHP.INI 中所設定的
本作品採用《CC 協議》,轉載必須註明作者和本文連結