您好,登錄后才能下訂單哦!
這篇文章主要講解了“PHP的Yii框架中緩存的一些高級(jí)用法分享”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“PHP的Yii框架中緩存的一些高級(jí)用法分享”吧!
頁(yè)面緩存
頁(yè)面緩存指的是在服務(wù)器端緩存整個(gè)頁(yè)面的內(nèi)容。隨后當(dāng)同一個(gè)頁(yè)面被請(qǐng)求時(shí),內(nèi)容將從緩存中取出,而不是重新生成。
頁(yè)面緩存由 yii\filters\PageCache 類提供支持,該類是一個(gè)過(guò)濾器。它可以像這樣在控制器類中使用:
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', ], ], ]; }
上述代碼表示頁(yè)面緩存只在 index 操作時(shí)啟用,頁(yè)面內(nèi)容最多被緩存 60 秒,會(huì)隨著當(dāng)前應(yīng)用的語(yǔ)言更改而變化。如果文章總數(shù)發(fā)生變化則緩存的頁(yè)面會(huì)失效。
如你所見,頁(yè)面緩存和片段緩存極其相似。它們都支持 duration,dependencies,variations 和 enabled 配置選項(xiàng)。它們的主要區(qū)別是頁(yè)面緩存是由過(guò)濾器實(shí)現(xiàn),而片段緩存則是一個(gè)小部件。
你可以在使用頁(yè)面緩存的同時(shí),使用片段緩存和動(dòng)態(tài)內(nèi)容。
HTTP 緩存
除了服務(wù)器端緩存外, Web 應(yīng)用還可以利用客戶端緩存去節(jié)省相同頁(yè)面內(nèi)容的生成和傳輸時(shí)間。
通過(guò)配置 yii\filters\HttpCache 過(guò)濾器,控制器操作渲染的內(nèi)容就能緩存在客戶端。yii\filters\HttpCache 過(guò)濾器僅對(duì) GET 和 HEAD 請(qǐng)求生效,它能為這些請(qǐng)求設(shè)置三種與緩存有關(guān)的 HTTP 頭。
yii\filters\HttpCache::lastModified
yii\filters\HttpCache::etagSeed
yii\filters\HttpCache::cacheControlHeader
Last-Modified 頭
Last-Modified 頭使用時(shí)間戳標(biāo)明頁(yè)面自上次客戶端緩存后是否被修改過(guò)。
通過(guò)配置 yii\filters\HttpCache::lastModified 屬性向客戶端發(fā)送 Last-Modified 頭。該屬性的值應(yīng)該為 PHP callable 類型,返回的是頁(yè)面修改時(shí)的 Unix 時(shí)間戳。該 callable 的參數(shù)和返回值應(yīng)該如下:
/** * @param Action $action 當(dāng)前處理的操作對(duì)象 * @param array $params “params” 屬性的值 * @return integer 頁(yè)面修改時(shí)的 Unix 時(shí)間戳 */ function ($action, $params)
以下是使用 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'); }, ], ]; }
上述代碼表明 HTTP 緩存只在 index 操作時(shí)啟用。它會(huì)基于頁(yè)面最后修改時(shí)間生成一個(gè) Last-Modified HTTP 頭。當(dāng)瀏覽器第一次訪問 index 頁(yè)時(shí),服務(wù)器將會(huì)生成頁(yè)面并發(fā)送至客戶端瀏覽器。之后客戶端瀏覽器在頁(yè)面沒被修改期間訪問該頁(yè),服務(wù)器將不會(huì)重新生成頁(yè)面,瀏覽器會(huì)使用之前客戶端緩存下來(lái)的內(nèi)容。因此服務(wù)端渲染和內(nèi)容傳輸都將省去。
ETag 頭
“Entity Tag”(實(shí)體標(biāo)簽,簡(jiǎn)稱 ETag)使用一個(gè)哈希值表示頁(yè)面內(nèi)容。如果頁(yè)面被修改過(guò),哈希值也會(huì)隨之改變。通過(guò)對(duì)比客戶端的哈希值和服務(wù)器端生成的哈希值,瀏覽器就能判斷頁(yè)面是否被修改過(guò),進(jìn)而決定是否應(yīng)該重新傳輸內(nèi)容。
通過(guò)配置 yii\filters\HttpCache::etagSeed 屬性向客戶端發(fā)送 ETag 頭。該屬性的值應(yīng)該為 PHP callable 類型,返回的是一段種子字符用來(lái)生成 ETag 哈希值。該 callable 的參數(shù)和返回值應(yīng)該如下:
/** * @param Action $action 當(dāng)前處理的操作對(duì)象 * @param array $params “params” 屬性的值 * @return string 一段種子字符用來(lái)生成 ETag 哈希值 */ function ($action, $params)
以下是使用 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]); }, ], ]; }
上述代碼表明 HTTP 緩存只在 view 操作時(shí)啟用。它會(huì)基于用戶請(qǐng)求的標(biāo)題和內(nèi)容生成一個(gè) ETag HTTP 頭。當(dāng)瀏覽器第一次訪問 view 頁(yè)時(shí),服務(wù)器將會(huì)生成頁(yè)面并發(fā)送至客戶端瀏覽器。之后客戶端瀏覽器標(biāo)題和內(nèi)容沒被修改在期間訪問該頁(yè),服務(wù)器將不會(huì)重新生成頁(yè)面,瀏覽器會(huì)使用之前客戶端緩存下來(lái)的內(nèi)容。因此服務(wù)端渲染和內(nèi)容傳輸都將省去。
ETag 相比 Last-Modified 能實(shí)現(xiàn)更復(fù)雜和更精確的緩存策略。例如,當(dāng)站點(diǎn)切換到另一個(gè)主題時(shí)可以使 ETag 失效。
復(fù)雜的 Etag 生成種子可能會(huì)違背使用 HttpCache 的初衷而引起不必要的性能開銷,因?yàn)轫憫?yīng)每一次請(qǐng)求都需要重新計(jì)算 Etag。請(qǐng)?jiān)囍页鲆粋€(gè)最簡(jiǎn)單的表達(dá)式去觸發(fā) Etag 失效。
注意:為了遵循 RFC 7232(HTTP 1.1 協(xié)議),如果同時(shí)配置了 ETag 和 Last-Modified 頭,HttpCache 將會(huì)同時(shí)發(fā)送它們。并且如果客戶端同時(shí)發(fā)送 If-None-Match 頭和 If-Modified-Since 頭,則只有前者會(huì)被接受。
Cache-Control 頭
Cache-Control 頭指定了頁(yè)面的常規(guī)緩存策略??梢酝ㄟ^(guò)配置 yii\filters\HttpCache::cacheControlHeader 屬性發(fā)送相應(yīng)的頭信息。默認(rèn)發(fā)送以下頭:
Cache-Control: public, max-age=3600
會(huì)話緩存限制器
當(dāng)頁(yè)面使 session 時(shí),PHP 將會(huì)按照 PHP.INI 中所設(shè)置的 session.cache_limiter 值自動(dòng)發(fā)送一些緩存相關(guān)的 HTTP 頭。這些 HTTP 頭有可能會(huì)干擾你原本設(shè)置的 HttpCache 或讓其失效。為了避免此問題,默認(rèn)情況下 HttpCache 禁止自動(dòng)發(fā)送這些頭。想改變這一行為,可以配置 yii\filters\HttpCache::sessionCacheLimiter 屬性。該屬性接受一個(gè)字符串值,包括 public,private,private_no_expire,和 nocache。
感謝各位的閱讀,以上就是“PHP的Yii框架中緩存的一些高級(jí)用法分享”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)PHP的Yii框架中緩存的一些高級(jí)用法分享這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。