如何使用yii2的緩存依賴特性

来源:https://www.cnblogs.com/libera/archive/2019/02/26/10434888.html
-Advertisement-
Play Games

[TOC] 如何使用yii2的緩存依賴特性 概述 緩存是Yii2的強大特性之一,合理使用緩存技術可以有效地減小伺服器的訪問壓力。Yii2最基本的緩存包括 數據緩存 、 片段緩存 、 頁面緩存 和 HTTP緩存 ,這部分內容在官方文檔中有更加詳細的說明,這裡不再贅述,如有需要可以參考Yii2官方開發文 ...


目錄

如何使用yii2的緩存依賴特性

概述

緩存是Yii2的強大特性之一,合理使用緩存技術可以有效地減小伺服器的訪問壓力。Yii2最基本的緩存包括數據緩存片段緩存頁面緩存HTTP緩存,這部分內容在官方文檔中有更加詳細的說明,這裡不再贅述,如有需要可以參考Yii2官方開發文檔中的緩存部分

頁面緩存

數據緩存與片段緩存都是針對網站中某一部分內容進行的緩存,這種緩存需要在代碼部分進行顯示聲明,修改起來比較麻煩。相對的頁面緩存則是針對控制器下方法,對這個方法的視圖文件進行頁面級別的緩存。由於頁面緩存可以使用行為的形式,對控制器進行註入,修改的時候只要在控制器中修改對應的配置項即可,所以使用頁面緩存更加簡單,擴展性更強。

緩存依賴

一般來說,緩存可以增強伺服器的性能,但會一定程度上減弱其交互性。所以需要對緩存進行定期的檢查,清理過期數據,填充最新數據,以保證內容的及時準確。在這一點上,Yii2的緩存依賴可以有效解決這個問題。Yii2共有五個內置的緩存類,如下所示:

  • yii\caching\ChainedDependency:如果依賴鏈上任何一個依賴產生變化,則依賴改變。
  • yii\caching\DbDependency:如果指定 SQL 語句的查詢結果發生了變化,則依賴改變。
  • yii\caching\ExpressionDependency:如果指定的 PHP 表達式執行結果發生變化,則依賴改變。
  • yii\caching\FileDependency:如果文件的最後修改時間發生變化,則依賴改變。
  • yii\caching\TagDependency:將緩存的數據項與一個或多個標簽相關聯。 您可以通過調用 yii\caching\TagDependency::invalidate() 來檢查指定標簽的緩存數據項是否有效。

以資料庫依賴DbDependency為例,在控制器IndexController中,聲明依賴關係:

<?php

namespace frontend\controllers;

use yii\web\Controller;

class IndexController extends Controller
{
    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',
                ],
            ],
        ];
    }

    public function actionIndex()
    {
        return $this->render('index');
    }
    
}

如代碼所示,在行為方法behaviors()中聲明頁面配置的驅動類,only對應為一個數組,數組元素是需要緩存的方法對應的視圖。duration表示過期時間,單位為秒。variations對應一個數組,系統會監聽這個數組中內容是否發生了變化,如果發生變化就會刷新緩存,反之則不會。dependency對應依賴關係,其中class表示緩存依賴的類,sql表示一個一條查詢語句。含義就是post數據表中記錄的總條數發生變化時,就可以認為新增或者刪除類某條數據,需要刷新緩存。

鏈式依賴

上面的例子非常簡單,而實際開發往往要更加複雜。有時候一個頁面是否需要刷新由很多因素決定,不是一個關係就可以描述清楚的。比如說post數據表中既沒有刪除沒有增加,而是更新一條數據,那上面那查詢語句就無法處理類。這時候,可以用SELECT MAX(*) FROM post檢測更新,但內置頁面緩存類中無法直接寫入這兩個查詢,這時候可以用鏈式依賴的內置類來解決這個問題。

所謂鏈式依賴,就是將緩存依賴關係配置到一個鏈中,一旦鏈中某個關係不成立,就會刷新緩存。
其中yii\caching\ChainedDependency就是緩存依賴的主要實現類。實現代碼如下所示:

<?php

namespace frontend\controllers;

use yii\web\Controller;

class IndexController extends Controller
{
    public function behaviors()
    {
        return [
            'pageCache' => [
                'class' => 'yii\filters\PageCache',
                'only' => ['index'],
                'duration' => 24 * 3600 * 365, // 1 year
                'variations' => [
                    \Yii::$app->language,
                    \Yii::$app->id
                ],
                'dependency' => [
                    'class' => 'yii\caching\ChainedDependency',
                    'dependencies' => [
                        new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM post']),
                        new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(id) FROM post']),
                        new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM category']),
                        new \yii\caching\DbDependency(['sql' => 'SELECT COUNT(id) FROM category']),
                        new \yii\caching\ExpressionDependency(['expression'=>'\Yii::$app->request->get("id")']);
                        new \yii\caching\FileDependency(['fileName'=>'yanying.txt']);
                    ]
                ],
            ],
        ];
    }

    public function actionIndex()
    {
        return $this->render('index');
    }
    
}

如上所示,dependency中配置類Yii2內置的鏈式依賴,併在dependencies中定義類緩存依賴關係的“鏈”。當鏈上某個關係不成立時,就會刷新緩存。另外在整個緩存頁面中,如果某一小部分並不需要緩存,可以將其設置為動態內容,這部分可以查看官方文檔,不過更推薦看源碼,文檔介紹的比較簡單。

總結

Yii2沒有提供HTML頁面靜態化的內置功能,而是提供了緩存機制。在開髮網站的時候可以通過偽靜態+緩存的方式優化內容頁面,並且採用內置的緩存依賴和鏈式依賴解決內容過期的問題,通過動態內容的設置處理不需要緩存的部分,比如登錄後,首頁可以會顯示用戶名,這部分就可以用動態內容。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 定義:裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。 裝飾器模式是為已有功能添加更多功能的一種方式,就增加功能來說,裝飾器模式比通過生成子類更為靈活。該模式通過將裝飾的功能放在單獨的類中,並讓這些類包含了需要進行裝飾的 ...
  • 方法一:繼承 Thread 類,覆蓋方法 run(),我們在創建的 Thread 類的子類中重寫 run() ,加入線程所要執行的代碼即可。 下麵是一個例子: 這種方法簡單明瞭,符合大家的習慣,但是,它也有一個很大的缺點,那就是如果我們的類已經從一個類繼承(如小程式必須繼承自 Applet 類),則 ...
  • 一、格式化拼接、format 1.字元串拼接 name = "Monica", age = 16 print("姓名"+name+“年齡”+age+".") 2.占位符 %s:string,%d:整數,%f:浮點 info1 = ‘’‘姓名:%s 年齡:%s’‘’%(name,age) print( ...
  • 題意 "題目鏈接" Sol 題解好神仙啊qwq。 一般看到這種考慮最大值的貢獻的題目不難想到單調數據結構 對於本題而言,我們可以預處理出每個位置左邊第一個比他大的位置$l_i$以及右邊第一個比他大的位置$r_i$ 那麼$(l_i, r_i)$會產生$p1$的貢獻 $[l_i + 1, i 1]$和$ ...
  • 這一篇博客,是關於反反爬蟲的,我會分享一些我遇到的反爬蟲的措施,並且會分享我自己的解決辦法。如果能對你有什麼幫助的話,麻煩點一下推薦啦。 一、UserAgent UserAgent中文名為用戶代理,它使得伺服器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本等信息。對於一些網站來說,它會 ...
  • 第89節: 中的反射技術 反射技術是動態的獲取指定的類,和動態的調用類中的內容(沒有類前就可以創建對象,將對象的動作完成,這就是動態的獲取指定的類)。 配置文件把具體實現的類名稱定義到配置文件中。 反射技術的作用可以提高程式的擴展性。 類 用於創建並返回此對象的一個副本 用於指示其他某個對象是否與這 ...
  • Spark RPC 框架對 Spark 來說是至關重要的,它在 Spark 中擔任中樞的作用。 ...
  • 迭代 通常意義上的迭代是指:重覆執行一系列運算,從前面的量依次推出後面的量的過程,每一次迭代的結果,會作為下一次迭代的初始值。 在c、c++、java等編程語言中的for迴圈語句,就是一個迭代過程,例如: 這種for迴圈語句比較符合迭代的含義,for語句中給定了一個初始輸入 i=0 ,然後開始執行一 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...