首頁 後端開發 php教程 如何使用yii2的快取依賴特性(程式碼範例)

如何使用yii2的快取依賴特性(程式碼範例)

Feb 27, 2019 am 09:31 AM
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 [
            [
                &#39;class&#39; => &#39;yii\filters\PageCache&#39;,
                &#39;only&#39; => [&#39;index&#39;],
                &#39;duration&#39; => 60,
                &#39;variations&#39; => [
                    \Yii::$app->language,
                ],
                &#39;dependency&#39; => [
                    &#39;class&#39; => &#39;yii\caching\DbDependency&#39;,
                    &#39;sql&#39; => &#39;SELECT COUNT(*) FROM post&#39;,
                ],
            ],
        ];
    }

    public function actionIndex()
    {
        return $this->render(&#39;index&#39;);
    }
    
}
登入後複製

如程式碼所示,在行為方法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 [
            &#39;pageCache&#39; => [
                &#39;class&#39; => &#39;yii\filters\PageCache&#39;,
                &#39;only&#39; => [&#39;index&#39;],
                &#39;duration&#39; => 24 * 3600 * 365, // 1 year
                &#39;variations&#39; => [
                    \Yii::$app->language,
                    \Yii::$app->id
                ],
                &#39;dependency&#39; => [
                    &#39;class&#39; => &#39;yii\caching\ChainedDependency&#39;,
                    &#39;dependencies&#39; => [
                        new \yii\caching\DbDependency([&#39;sql&#39; => &#39;SELECT MAX(updated_at) FROM post&#39;]),
                        new \yii\caching\DbDependency([&#39;sql&#39; => &#39;SELECT COUNT(id) FROM post&#39;]),
                        new \yii\caching\DbDependency([&#39;sql&#39; => &#39;SELECT MAX(updated_at) FROM category&#39;]),
                        new \yii\caching\DbDependency([&#39;sql&#39; => &#39;SELECT COUNT(id) FROM category&#39;]),
                        new \yii\caching\ExpressionDependency([&#39;expression&#39;=>&#39;\Yii::$app->request->get("id")&#39;]);
                        new \yii\caching\FileDependency([&#39;fileName&#39;=>&#39;yanying.txt&#39;]);
                    ]
                ],
            ],
        ];
    }

    public function actionIndex()
    {
        return $this->render(&#39;index&#39;);
    }
    
}
登入後複製

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

總結

Yii2沒有提供HTML頁面靜態化的內建功能,而是提供了快取機制。在開發網站的時候可以透過偽靜態快取的方式來優化內容頁面,並且採用內建的快取依賴和鍊式依賴解決內容過期的問題,透過動態內容的設定處理不需要快取的部分,例如登入後,首頁可以會顯示用戶名,這部分就可以用動態內容。

以上是如何使用yii2的快取依賴特性(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

在PHPStorm中如何進行CLI模式的調試? 在PHPStorm中如何進行CLI模式的調試? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

如何用PHP的cURL庫發送包含JSON數據的POST請求? 如何用PHP的cURL庫發送包含JSON數據的POST請求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

See all articles