簡介PHP的Yii架構中緩衝的一些進階用法,phpyii架構緩衝
頁面緩衝
頁面緩衝指的是在伺服器端緩衝整個頁面的內容。隨後當同一個頁面被請求時,內容將從緩衝中取出,而不是重建。
頁面緩衝由 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 手冊中的緩衝限制器瞭解這些值的含義。
SEO 影響
搜尋引擎趨向於遵循網站的緩衝頭。因為一些爬蟲的抓取頻率有限制,啟用緩衝頭可以可以減少重複請求數量,增加爬蟲抓取效率(譯者:大意如此,但搜尋引擎的排名規則不瞭解,好的緩衝策略應該是可以為使用者體驗加分的)。
您可能感興趣的文章:
- 詳解PHP的Yii架構中內建的前端資源套件的使用
- 深入解析PHP的Yii架構中的緩衝功能
- PHP的Yii架構中View視圖的使用進階
- PHP的Yii架構中建立視圖和渲染視圖的方法詳解
- PHP的Yii架構中Model模型的學習教程
- 詳解PHP的Yii架構中的Controller控制器
- PHP的Yii架構中移除組件所綁定的行為的方法
- PHP的Yii架構中行為的定義與Binder 方法講解
- 深入講解PHP的Yii架構中的屬性(Property)
- 詳解PHP的Yii架構中擴充的安裝與使用
http://www.bkjia.com/PHPjc/1117068.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1117068.htmlTechArticle簡介PHP的Yii架構中緩衝的一些進階用法,phpyii架構緩衝 頁面緩衝 頁面緩衝指的是在伺服器端緩衝整個頁面的內容。隨後當同一個頁面被請...