亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

direktori cari
閱讀前篇 簡(jiǎn)介 Yii 是什么 從 Yii 1.1 升級(jí) 入門 安裝 Yii 運(yùn)行應(yīng)用 第一次問候 使用Forms 數(shù)據(jù)庫應(yīng)用 使用 Gii 生成代碼 進(jìn)階 應(yīng)用結(jié)構(gòu) 概述 入口腳本 應(yīng)用(Applications) 應(yīng)用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴(kuò)展(Extensions) 請(qǐng)求處理 運(yùn)行概述 啟動(dòng)引導(dǎo)(Bootstrapping) 路由和創(chuàng)建URL 請(qǐng)求(Requests) 響應(yīng)(Responses) Sessions 和 Cookies 錯(cuò)誤處理(Handling Errors) 日志(Logging) 關(guān)鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動(dòng)加載(Autoloading) 服務(wù)定位器(Service Locator) 依賴注入容器(Dependency Injection Container) 配合數(shù)據(jù)庫工作 數(shù)據(jù)庫訪問 (Data Access Objects) 查詢生成器(Query Builder) 活動(dòng)記錄(Active Record) 數(shù)據(jù)庫遷移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用戶數(shù)據(jù) 創(chuàng)建表單(Creating Forms) 輸入驗(yàn)證(Validating Input) 文件上傳(Uploading Files) 收集列表輸入(Collecting Tabular Input) 多模型的復(fù)合表單(Getting Data for Multiple Models) 顯示數(shù)據(jù) 格式化輸出數(shù)據(jù)(Data Formatting) 分頁(Pagination) 排序(Sorting) 數(shù)據(jù)提供器(Data Providers) 數(shù)據(jù)小部件(Data Widgets) 客戶端腳本使用(Working with Client Scripts) 主題(Theming) 安全 認(rèn)證(Authentication) 授權(quán)(Authorization) 處理密碼(Working with Passwords) 客戶端認(rèn)證(Auth Clients) 最佳安全實(shí)踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁面緩存 HTTP 緩存 RESTfull Web服務(wù) 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(yīng)(Response Formatting) 授權(quán)認(rèn)證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯(cuò)誤處理(Error Handling) 開發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測(cè)試 概述(Overview) 配置測(cè)試環(huán)境(Testing environment setup) 單元測(cè)試(Unit Tests) 功能測(cè)試(Function Tests) 驗(yàn)收測(cè)試(Acceptance Tests) 測(cè)試夾具(Fixtures) 高級(jí)專題 高級(jí)應(yīng)用模板 創(chuàng)建自定義應(yīng)用程序結(jié)構(gòu) 控制臺(tái)命令 核心驗(yàn)證器(Core Validators) 國際化 收發(fā)郵件 性能優(yōu)化 共享主機(jī)環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
watak

片段緩存

片段緩存

片段緩存指的是緩存頁面內(nèi)容中的某個(gè)片段。例如,一個(gè)頁面顯示了逐年銷售額的摘要表格,可以把表格緩存下來,以消除每次請(qǐng)求都要重新生成表格的耗時(shí)。片段緩存是基于數(shù)據(jù)緩存實(shí)現(xiàn)的。

在視圖中使用以下結(jié)構(gòu)啟用片段緩存:

if ($this->beginCache($id)) {

    // ... 在此生成內(nèi)容 ...

    $this->endCache();
}

調(diào)用 yii\base\View::beginCache() 和 yii\base\View::endCache() 方法包裹內(nèi)容生成邏輯。如果緩存中存在該內(nèi)容,yii\base\View::beginCache() 方法將渲染內(nèi)容并返回 false,因此將跳過內(nèi)容生成邏輯。否則,內(nèi)容生成邏輯被執(zhí)行,一直執(zhí)行到 yii\base\View::endCache() 時(shí),生成的內(nèi)容將被捕獲并存儲(chǔ)在緩存中。

和[數(shù)據(jù)緩存]一樣,每個(gè)片段緩存也需要全局唯一的?$id?標(biāo)記。

緩存選項(xiàng)

如果要為片段緩存指定額外配置項(xiàng),請(qǐng)通過向 yii\base\View::beginCache() 方法第二個(gè)參數(shù)傳遞配置數(shù)組。在框架內(nèi)部,該數(shù)組將被用來配置一個(gè) yii\widget\FragmentCache 小部件用以實(shí)現(xiàn)片段緩存功能。

過期時(shí)間(duration)

或許片段緩存中最常用的一個(gè)配置選項(xiàng)就是 yii\widgets\FragmentCache::duration 了。它指定了內(nèi)容被緩存的秒數(shù)。以下代碼緩存內(nèi)容最多一小時(shí):

if ($this->beginCache($id, ['duration' => 3600])) {

    // ... 在此生成內(nèi)容 ...

    $this->endCache();
}

如果該選項(xiàng)未設(shè)置,則默認(rèn)為 0,永不過期。

依賴

和[數(shù)據(jù)緩存]一樣,片段緩存的內(nèi)容一樣可以設(shè)置緩存依賴。例如一段被緩存的文章,是否重新緩存取決于它是否被修改過。

通過設(shè)置 yii\widgets\FragmentCache::dependency 選項(xiàng)來指定依賴,該選項(xiàng)的值可以是一個(gè) yii\caching\Dependency 類的派生類,也可以是創(chuàng)建緩存對(duì)象的配置數(shù)組。以下代碼指定了一個(gè)片段緩存,它依賴于?update_at?字段是否被更改過的。

$dependency = [
    'class' => 'yii\caching\DbDependency',
    'sql' => 'SELECT MAX(updated_at) FROM post',
];

if ($this->beginCache($id, ['dependency' => $dependency])) {

    // ... 在此生成內(nèi)容 ...

    $this->endCache();
}

變化

緩存的內(nèi)容可能需要根據(jù)一些參數(shù)的更改而變化。例如一個(gè) Web 應(yīng)用支持多語言,同一段視圖代碼也許需要生成多個(gè)語言的內(nèi)容。因此可以設(shè)置緩存根據(jù)應(yīng)用當(dāng)前語言而變化。

通過設(shè)置 yii\widgets\FragmentCache::variations 選項(xiàng)來指定變化,該選項(xiàng)的值應(yīng)該是一個(gè)標(biāo)量,每個(gè)標(biāo)量代表不同的變化系數(shù)。例如設(shè)置緩存根據(jù)當(dāng)前語言而變化可以用以下代碼:

if ($this->beginCache($id, ['variations' => [Yii::$app->language]])) {

    // ... 在此生成內(nèi)容 ...

    $this->endCache();
}

開關(guān)

有時(shí)你可能只想在特定條件下開啟片段緩存。例如,一個(gè)顯示表單的頁面,可能只需要在初次請(qǐng)求時(shí)緩存表單(通過 GET 請(qǐng)求)。隨后請(qǐng)求所顯示(通過 POST 請(qǐng)求)的表單不該使用緩存,因?yàn)榇藭r(shí)表單中可能包含用戶輸入內(nèi)容。鑒于此種情況,可以使用 yii\widgets\FragmentCache::enabled 選項(xiàng)來指定緩存開關(guān),如下所示:

if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) {

    // ... 在此生成內(nèi)容 ...

    $this->endCache();
}

緩存嵌套

片段緩存可以被嵌套使用。一個(gè)片段緩存可以被另一個(gè)包裹。例如,評(píng)論被緩存在里層,同時(shí)整個(gè)評(píng)論的片段又被緩存在外層的文章中。以下代碼展示了片段緩存的嵌套使用:

if ($this->beginCache($id1)) {

    // ...在此生成內(nèi)容...

    if ($this->beginCache($id2, $options2)) {

        // ...在此生成內(nèi)容...

        $this->endCache();
    }

    // ...在此生成內(nèi)容...

    $this->endCache();
}

可以為嵌套的緩存設(shè)置不同的配置項(xiàng)。例如,內(nèi)層緩存和外層緩存使用不同的過期時(shí)間。甚至當(dāng)外層緩存的數(shù)據(jù)過期失效了,內(nèi)層緩存仍然可能提供有效的片段緩存數(shù)據(jù)。但是,反之則不然。如果外層片段緩存沒有過期而被視為有效,此時(shí)即使內(nèi)層片段緩存已經(jīng)失效,它也將繼續(xù)提供同樣的緩存副本。因此,你必須謹(jǐn)慎處理緩存嵌套中的過期時(shí)間和依賴,否則外層的片段很有可能返回的是不符合你預(yù)期的失效數(shù)據(jù)。

譯注:外層的失效時(shí)間應(yīng)該短于內(nèi)層,外層的依賴條件應(yīng)該低于內(nèi)層,以確保最小的片段,返回的是最新的數(shù)據(jù)。

動(dòng)態(tài)內(nèi)容

使用片段緩存時(shí),可能會(huì)遇到一大段較為靜態(tài)的內(nèi)容中有少許動(dòng)態(tài)內(nèi)容的情況。例如,一個(gè)顯示著菜單欄和當(dāng)前用戶名的頁面頭部。還有一種可能是緩存的內(nèi)容可能包含每次請(qǐng)求都需要執(zhí)行的 PHP 代碼(例如注冊(cè)資源包的代碼)。這兩個(gè)問題都可以使用動(dòng)態(tài)內(nèi)容功能解決。

動(dòng)態(tài)內(nèi)容的意思是這部分輸出的內(nèi)容不該被緩存,即便是它被包裹在片段緩存中。為了使內(nèi)容保持動(dòng)態(tài),每次請(qǐng)求都執(zhí)行 PHP 代碼生成,即使這些代碼已經(jīng)被緩存了。

可以在片段緩存中調(diào)用 yii\base\View::renderDynamic() 去插入動(dòng)態(tài)內(nèi)容,如下所示:

if ($this->beginCache($id1)) {

    // ...在此生成內(nèi)容...

    echo $this->renderDynamic('return Yii::$app->user->identity->name;');

    // ...在此生成內(nèi)容...

    $this->endCache();
}
yii\base\View::renderDynamic() 方法接受一段 PHP 代碼作為參數(shù)。代碼的返回值被看作是動(dòng)態(tài)內(nèi)容。這段代碼將在每次請(qǐng)求時(shí)都執(zhí)行,無論其外層的片段緩存是否被存儲(chǔ)。
Artikel sebelumnya: Artikel seterusnya: