首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Yii 片段快取啟用與配置完整指南

     編輯:PHP 綜合知識

片段快取概念

片段快取(Fragment Caching)針對視圖中的特定區塊進行快取,而非整頁。適用於:側邊欄熱門文章、導航選單、頁尾資訊等局部更新頻率較低的區塊。

快取元件設定(config/main.php)

'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(); // 結束快取區塊,自動儲存
}
?>

參數詳細說明

參數型別說明
durationinteger快取存活秒數,0 表示永久(需手動清除或相依性觸發)
varyByParamarray依請求參數區分快取版本,如 ['id', 'lang']
varyByRouteboolean是否依路由區分(預設 true)
varyBySessionboolean/array依 Session ID 或特定 Session 變數區分
dependencyarray/ICacheDependency快取相依性物件設定
requestTypesarray僅快取指定請求類型,預設 ['GET']

常見相依性類別

  • CDbCacheDependency:SQL 查詢結果變化觸發失效
  • CFileCacheDependency:檔案修改時間變化觸發
  • CExpressionDependency:PHP 表達式結果變化觸發
  • CGlobalStateCacheDependency:全域狀態變化觸發
  • CChainedCacheDependency:多重相依性串聯(任一觸發即失效)

動態內容:快取區塊中的即時資料

若快取區塊中包含須即時顯示的內容(如使用者名稱、購物車數量),使用 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() 記錄快取命中/未命中
  • 生產環境可整合 Yii Debug Toolbar 檢視快取統計

避坑指南

  1. 快取鍵衝突:不同視圖使用相同 ID 會互相覆蓋,建議加前綴如 view_article_sidebar。
  2. 巢狀快取:片段快取不支援巢狀,內層 beginCache 會被忽略。
  3. 動態參數未包含:varyByParam 漏掉分頁、語系等參數導致錯誤內容服務給不同用戶。
  4. 相依性 SQL 過重:COUNT(*) 在大表較慢,改用 MAX(updated_at) 或觸發器維護計數表。
  5. 開發環境快取干擾:開發時建議關閉快取或設極短 duration,避免看不到修改效果。

片段快取是提升頁面回應速度的利器,善用相依性機制可兼顧資料即時性與效能,是 Yii 應用優化的關鍵技術之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved