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

Yii 框架進階快取技術:頁面快取與 HTTP 快取深度實戰

     編輯:PHP 綜合知識

Yii 快取體系架構概覽

Yii 提供多層次快取方案,從資料快取、查詢快取到片段快取、頁面快取與 HTTP 快取,形成完整的效能優化體系。本文聚焦於伺服器端的頁面快取與客戶端的 HTTP 快取,這兩種機制雖同樣以減少重複運算為目標,但運作層面與適用場景截然不同。

頁面快取:伺服器端全頁面快取

核心實作

透過 yii\filters\PageCache 過濾器實現,配置範例:

public function behaviors()
{
    return [
        [
            'class' => 'yii\filters\PageCache',
            'only' => ['index'],
            'duration' => 60,
            'variations' => [\Yii::$app->language],
            'dependency' => [
                'class' => 'yii\caching\DbDependency',
                'sql' => 'SELECT COUNT(*) FROM post',
            ],
        ],
    ];
}

關鍵配置解析

  • only:僅對指定動作啟用(此處為 index)
  • duration:快取有效秒數(60 秒)
  • variations:根據應用語言建立不同快取版本
  • dependency:資料庫依賴,文章總數變化時自動失效

與片段快取異同

兩者支援相同配置選項,核心差異在於實現方式:頁面快取基於過濾器,片段快取基於 Widget。兩者可同時使用,並可搭配動態內容功能。

HTTP 快取:客戶端瀏覽器快取

利用瀏覽器快取機制減少伺服器渲染與傳輸開銷,僅對 GET/HEAD 請求生效。透過 yii\filters\HttpCache 設定三種 HTTP 標頭:

Last-Modified 標頭

基於時間戳記判斷內容是否更新:

public function behaviors()
{
    return [
        [
            'class' => 'yii\filters\HttpCache',
            'only' => ['index'],
            'lastModified' => function ($action, $params) {
                $q = new \yii\db\Query();
                return $q->from('post')->max('updated_at');
            },
        ],
    ];
}

運作流程:首次請求回傳內容與 Last-Modified 標頭;後續請求瀏覽器發送 If-Modified-Since,伺服器比對時間戳,未修改則回傳 304 Not Modified,瀏覽器直接使用快取。

ETag 標頭

基於內容哈希值實現更精確的快取驗證:

public function behaviors()
{
    return [
        [
            'class' => 'yii\filters\HttpCache',
            'only' => ['view'],
            'etagSeed' => function ($action, $params) {
                $post = $this->findModel(\Yii::$app->request->get('id'));
                return serialize([$post->title, $post->content]);
            },
        ],
    ];
}

優勢:支援主題切換等非時間型變更導致的快取失效。注意:複雜的 ETag 種子生成可能抵消快取效益,建議尋找最簡表達式觸發失效。

Cache-Control 標頭

指定通用快取策略,預設發送:

Cache-Control: public, max-age=3600

可透過 cacheControlHeader 屬性自訂。

Session 快取限制器

PHP 預設會根據 session.cache_limiter 發送快取標頭,可能干擾 HttpCache。預設禁止自動發送,可透過 sessionCacheLimiter 屬性調整(值:public、private、private_no_expire、nocache)。

SEO 影響與最佳實踐

  • 搜尋引擎遵循快取標頭,良好的快取策略可減少重複抓取,提升爬蟲效率
  • 頁面快取適合內容相對靜態、流量大的頁面(首頁、列表頁)
  • HTTP 快取適合 RESTful API、靜態資源、個人化程度低的頁面
  • 兩者可疊加使用:伺服器端快取生成內容,客戶端快取減少傳輸
  • 動態內容區塊使用 renderDynamic() 排除在片段快取之外

進階快取組合策略

public function behaviors()
{
    return [
        // HTTP 快取最外層
        [
            'class' => 'yii\filters\HttpCache',
            'only' => ['index'],
            'lastModified' => function ($action, $params) {
                return Post::find()->max('updated_at');
            },
        ],
        // 頁面快取內層
        [
            'class' => 'yii\filters\PageCache',
            'only' => ['index'],
            'duration' => 300,
            'variations' => [\Yii::$app->language],
        ],
    ];
}

這種分層快取架構能最大化效能效益:HTTP 快取攔截重複請求,頁面快取減少伺服器渲染運算,資料快取加速資料庫查詢。

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