片段快取(Fragment Caching)針對視圖中的特定區塊進行快取,而非整頁。適用於:側邊欄熱門文章、導航選單、頁尾資訊等局部更新頻率較低的區塊。
'components' => [
'cache' => [
'class' => 'system.caching.CFileCache', // 或 CDbCache、CMemCache、CRedisCache
],
],
<?php
// beginCache 參數陣列說明:
// - duration: 快取秒數 (0=永久)
// - varyByParam: 依 GET 參數區分快取版本 (如 ['page'] 不同分頁不同快取)
// - dependency: 快取相依性,資料變動自動失效
if ($this->beginCache('sidebar_hot_articles', [
'duration' => 3600, // 1小時
'varyByParam' => ['page'], // 不同 page 參數產生不同快取
'dependency' => [
'class' => 'system.caching.CDbCacheDependency',
'sql' => 'SELECT COUNT(*) FROM {{article}} WHERE status=1', // 文章數變化則失效
],
])) {
// --- 此區塊內容僅在快取未命中時執行 ---
$hotArticles = Article::model()->findAll([
'condition' => 'status=1',
'order' => 'view_count DESC',
'limit' => 10,
]);
$this->renderPartial('_hotArticles', ['articles' => $hotArticles]);
// -----------------------------------------
$this->endCache(); // 結束快取區塊,自動儲存
}
?>
| 參數 | 型別 | 說明 |
|---|---|---|
| duration | integer | 快取存活秒數,0 表示永久(需手動清除或相依性觸發) |
| varyByParam | array | 依請求參數區分快取版本,如 ['id', 'lang'] |
| varyByRoute | boolean | 是否依路由區分(預設 true) |
| varyBySession | boolean/array | 依 Session ID 或特定 Session 變數區分 |
| dependency | array/ICacheDependency | 快取相依性物件設定 |
| requestTypes | array | 僅快取指定請求類型,預設 ['GET'] |
若快取區塊中包含須即時顯示的內容(如使用者名稱、購物車數量),使用 COutputCache 的動態內容功能:
<?php if ($this->beginCache('header', ['duration'=>3600])): ?>
<div class="header">
歡迎,<?php echo $this->renderDynamic('renderUserName'); ?>
購物車:<?php echo $this->renderDynamic(['CartWidget', 'renderCount']); ?>
</div>
<?php $this->endCache(); ?>
對應控制器/元件需定義回呼方法:
public function renderUserName() {
return Yii::app()->user->isGuest ? '訪客' : Yii::app()->user->name;
}
// 手動清除特定快取
Yii::app()->cache->delete('yii_fragment_sidebar_hot_articles'); // 鍵名格式:yii_fragment_
// 或透過標籤式快取(需支援標籤的快取元件如 Redis)
// Yii::app()->cache->invalidateTag('article_list');
YII_DEBUG 並檢視頁面執行時間Yii::trace() 記錄快取命中/未命中view_article_sidebar。beginCache 會被忽略。varyByParam 漏掉分頁、語系等參數導致錯誤內容服務給不同用戶。COUNT(*) 在大表較慢,改用 MAX(updated_at) 或觸發器維護計數表。duration,避免看不到修改效果。片段快取是提升頁面回應速度的利器,善用相依性機制可兼顧資料即時性與效能,是 Yii 應用優化的關鍵技術之一。