欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

簡介PHP的Yii框架中緩存的一些高級用法

 更新時(shí)間:2016年03月29日 17:32:05   投稿:goldensun  
這篇文章主要介紹了PHP的Yii框架中緩存的一些高級用法,包括頁面緩存與會(huì)話緩存限制器等內(nèi)容,需要的朋友可以參考下

頁面緩存
頁面緩存指的是在服務(wù)器端緩存整個(gè)頁面的內(nèi)容。隨后當(dāng)同一個(gè)頁面被請求時(shí),內(nèi)容將從緩存中取出,而不是重新生成。

頁面緩存由 yii\filters\PageCache 類提供支持,該類是一個(gè)過濾器。它可以像這樣在控制器類中使用:

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',
   ],
  ],
 ];
}

上述代碼表示頁面緩存只在 index 操作時(shí)啟用,頁面內(nèi)容最多被緩存 60 秒,會(huì)隨著當(dāng)前應(yīng)用的語言更改而變化。如果文章總數(shù)發(fā)生變化則緩存的頁面會(huì)失效。

如你所見,頁面緩存和片段緩存極其相似。它們都支持 duration,dependencies,variations 和 enabled 配置選項(xiàng)。它們的主要區(qū)別是頁面緩存是由過濾器實(shí)現(xiàn),而片段緩存則是一個(gè)小部件。

你可以在使用頁面緩存的同時(shí),使用片段緩存和動(dòng)態(tài)內(nèi)容。

HTTP 緩存

除了服務(wù)器端緩存外, Web 應(yīng)用還可以利用客戶端緩存去節(jié)省相同頁面內(nèi)容的生成和傳輸時(shí)間。

通過配置 yii\filters\HttpCache 過濾器,控制器操作渲染的內(nèi)容就能緩存在客戶端。yii\filters\HttpCache 過濾器僅對 GET 和 HEAD 請求生效,它能為這些請求設(shè)置三種與緩存有關(guān)的 HTTP 頭。

  • yii\filters\HttpCache::lastModified
  • yii\filters\HttpCache::etagSeed
  • yii\filters\HttpCache::cacheControlHeader

Last-Modified 頭

Last-Modified 頭使用時(shí)間戳標(biāo)明頁面自上次客戶端緩存后是否被修改過。

通過配置 yii\filters\HttpCache::lastModified 屬性向客戶端發(fā)送 Last-Modified 頭。該屬性的值應(yīng)該為 PHP callable 類型,返回的是頁面修改時(shí)的 Unix 時(shí)間戳。該 callable 的參數(shù)和返回值應(yīng)該如下:

/**
 * @param Action $action 當(dāng)前處理的操作對象
 * @param array $params “params” 屬性的值
 * @return integer 頁面修改時(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ì)基于頁面最后修改時(shí)間生成一個(gè) Last-Modified HTTP 頭。當(dāng)瀏覽器第一次訪問 index 頁時(shí),服務(wù)器將會(huì)生成頁面并發(fā)送至客戶端瀏覽器。之后客戶端瀏覽器在頁面沒被修改期間訪問該頁,服務(wù)器將不會(huì)重新生成頁面,瀏覽器會(huì)使用之前客戶端緩存下來的內(nèi)容。因此服務(wù)端渲染和內(nèi)容傳輸都將省去。

ETag 頭

“Entity Tag”(實(shí)體標(biāo)簽,簡稱 ETag)使用一個(gè)哈希值表示頁面內(nèi)容。如果頁面被修改過,哈希值也會(huì)隨之改變。通過對比客戶端的哈希值和服務(wù)器端生成的哈希值,瀏覽器就能判斷頁面是否被修改過,進(jìn)而決定是否應(yīng)該重新傳輸內(nèi)容。

通過配置 yii\filters\HttpCache::etagSeed 屬性向客戶端發(fā)送 ETag 頭。該屬性的值應(yīng)該為 PHP callable 類型,返回的是一段種子字符用來生成 ETag 哈希值。該 callable 的參數(shù)和返回值應(yīng)該如下:

/**
 * @param Action $action 當(dāng)前處理的操作對象
 * @param array $params “params” 屬性的值
 * @return string 一段種子字符用來生成 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ì)基于用戶請求的標(biāo)題和內(nèi)容生成一個(gè) ETag HTTP 頭。當(dāng)瀏覽器第一次訪問 view 頁時(shí),服務(wù)器將會(huì)生成頁面并發(fā)送至客戶端瀏覽器。之后客戶端瀏覽器標(biāo)題和內(nèi)容沒被修改在期間訪問該頁,服務(wù)器將不會(huì)重新生成頁面,瀏覽器會(huì)使用之前客戶端緩存下來的內(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)每一次請求都需要重新計(jì)算 Etag。請?jiān)囍页鲆粋€(gè)最簡單的表達(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 頭指定了頁面的常規(guī)緩存策略??梢酝ㄟ^配置 yii\filters\HttpCache::cacheControlHeader 屬性發(fā)送相應(yīng)的頭信息。默認(rèn)發(fā)送以下頭:

Cache-Control: public, max-age=3600

會(huì)話緩存限制器

當(dāng)頁面使 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 手冊中的緩存限制器了解這些值的含義。

SEO 影響

搜索引擎趨向于遵循站點(diǎn)的緩存頭。因?yàn)橐恍┡老x的抓取頻率有限制,啟用緩存頭可以可以減少重復(fù)請求數(shù)量,增加爬蟲抓取效率(譯者:大意如此,但搜索引擎的排名規(guī)則不了解,好的緩存策略應(yīng)該是可以為用戶體驗(yàn)加分的)。

 

相關(guān)文章

  • PHP超全局變量實(shí)現(xiàn)原理及代碼解析

    PHP超全局變量實(shí)現(xiàn)原理及代碼解析

    這篇文章主要介紹了PHP超全局變量實(shí)現(xiàn)原理及代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • PHP調(diào)用Linux的命令行執(zhí)行文件壓縮命令

    PHP調(diào)用Linux的命令行執(zhí)行文件壓縮命令

    一開始,我和普通青年一樣,想到用PHP內(nèi)置的 ZipArchive糾結(jié)的是環(huán)境上沒安裝zip擴(kuò)展,想采用用PHP調(diào)用Linux的命令行 ,執(zhí)行壓縮命令,感興趣的朋友可以了解下,希望本文對你有所幫助
    2013-01-01
  • PHP郵箱驗(yàn)證示例教程

    PHP郵箱驗(yàn)證示例教程

    這篇文章主要為大家詳細(xì)介紹了PHP郵箱驗(yàn)證示例,通過實(shí)例一步步帶領(lǐng)大家認(rèn)識(shí)PHP郵箱驗(yàn)證的過程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 基于flush()不能按順序輸出時(shí)的解決辦法

    基于flush()不能按順序輸出時(shí)的解決辦法

    本篇文章是對flush()不能按順序輸出時(shí)的解決辦法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • smarty 緩存控制前的頁面靜態(tài)化原理

    smarty 緩存控制前的頁面靜態(tài)化原理

    在配置文件中我們應(yīng)設(shè)置了緩存的目錄,但是緩存的只有一個(gè)文件,怎么讓一個(gè)模版有多個(gè)緩存文件呢
    2013-03-03
  • 最新評論