中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP的Yii框架中緩存的一些高級用法分享

發布時間:2021-09-01 21:17:51 來源:億速云 閱讀:108 作者:chen 欄目:開發技術

這篇文章主要講解了“PHP的Yii框架中緩存的一些高級用法分享”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“PHP的Yii框架中緩存的一些高級用法分享”吧!

頁面緩存
頁面緩存指的是在服務器端緩存整個頁面的內容。隨后當同一個頁面被請求時,內容將從緩存中取出,而不是重新生成。

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

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 操作時啟用,頁面內容最多被緩存 60 秒,會隨著當前應用的語言更改而變化。如果文章總數發生變化則緩存的頁面會失效。

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

你可以在使用頁面緩存的同時,使用片段緩存和動態內容。

HTTP 緩存

除了服務器端緩存外, Web 應用還可以利用客戶端緩存去節省相同頁面內容的生成和傳輸時間。

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

  • yii\filters\HttpCache::lastModified

  • yii\filters\HttpCache::etagSeed

  • yii\filters\HttpCache::cacheControlHeader

Last-Modified 頭

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

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

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

ETag 頭

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

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

/**
 * @param Action $action 當前處理的操作對象
 * @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 操作時啟用。它會基于用戶請求的標題和內容生成一個 ETag HTTP 頭。當瀏覽器第一次訪問 view 頁時,服務器將會生成頁面并發送至客戶端瀏覽器。之后客戶端瀏覽器標題和內容沒被修改在期間訪問該頁,服務器將不會重新生成頁面,瀏覽器會使用之前客戶端緩存下來的內容。因此服務端渲染和內容傳輸都將省去。

ETag 相比 Last-Modified 能實現更復雜和更精確的緩存策略。例如,當站點切換到另一個主題時可以使 ETag 失效。

復雜的 Etag 生成種子可能會違背使用 HttpCache 的初衷而引起不必要的性能開銷,因為響應每一次請求都需要重新計算 Etag。請試著找出一個最簡單的表達式去觸發 Etag 失效。

注意:為了遵循 RFC 7232(HTTP 1.1 協議),如果同時配置了 ETag 和 Last-Modified 頭,HttpCache 將會同時發送它們。并且如果客戶端同時發送 If-None-Match 頭和 If-Modified-Since 頭,則只有前者會被接受。
Cache-Control 頭

Cache-Control 頭指定了頁面的常規緩存策略。可以通過配置 yii\filters\HttpCache::cacheControlHeader 屬性發送相應的頭信息。默認發送以下頭:

Cache-Control: public, max-age=3600

會話緩存限制器

當頁面使 session 時,PHP 將會按照 PHP.INI 中所設置的 session.cache_limiter 值自動發送一些緩存相關的 HTTP 頭。這些 HTTP 頭有可能會干擾你原本設置的 HttpCache 或讓其失效。為了避免此問題,默認情況下 HttpCache 禁止自動發送這些頭。想改變這一行為,可以配置 yii\filters\HttpCache::sessionCacheLimiter 屬性。該屬性接受一個字符串值,包括 public,private,private_no_expire,和 nocache。

感謝各位的閱讀,以上就是“PHP的Yii框架中緩存的一些高級用法分享”的內容了,經過本文的學習后,相信大家對PHP的Yii框架中緩存的一些高級用法分享這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

哈密市| 大埔区| 阜新| 临洮县| 扎鲁特旗| 启东市| 泽普县| 宜州市| 柳州市| 收藏| 九江市| 德惠市| 安庆市| 类乌齐县| 正安县| 盖州市| 徐闻县| 陇西县| 万全县| 无锡市| 赤城县| 奉贤区| 顺平县| 北京市| 巩留县| 炉霍县| 连平县| 伊金霍洛旗| 冕宁县| 阆中市| 西乌珠穆沁旗| 西丰县| 普洱| 荣成市| 尼勒克县| 竹山县| 和硕县| 平阴县| 屯留县| 平顺县| 四会市|