如何使用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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...