Yii2.0http緩存設置

Yii 2.0 的 http緩存是基於http協議的,只對 GET 請求生效。
應用場景:若是咱們的web服務器採用動靜分離的技術,即客戶端的頁面請求只請求html頁面框架(靜態數據),而客戶端的數據請求(動態數據)經過Ajax請求來實現,那麼咱們就能夠將靜態數據利用http緩存來實現。
 
http緩存的原理:
若是開啓了http緩存,客戶端瀏覽器請求服務器時,會給服務器發送一個 If-Modified-Since(時間戳,包含在請求消息頭中),服務器會將該時間戳與自身的 lastModified(也是一個時間戳)的值進行比較:
若是兩者的值一致,服務器就會直接給瀏覽器響應一個狀態行(304 Not Modified),告訴瀏覽器請求的頁面沒有變化,這樣瀏覽器就會從自身的緩存中取出頁面呈現給用戶;
若是兩者的值不一致,服務器就會給瀏覽器響應一個 lastModified(時間戳,包含在響應消息頭中),同時把最新的頁面響應給客戶端瀏覽器,瀏覽器再把這個頁面呈現給用戶。
 
固然,咱們也能夠用 etagSeed 代替 lastModified,原理相似,但 etagSeed 操做起來更加靈活,它也適合於非動靜分離的場景。
 
http緩存利用的是客戶端瀏覽器的緩存,故不須要服務器端緩存介質的支持。
 
這裏以 Yii 2.0 高級版爲例,介紹http緩存。
 
操做http緩存的類文件爲 /advanced/vendor/yiisoft/yii2/filters/HttpCache.php
 
首先,修改前臺的變量配置文件 /advanced/frontend/config/params.php,配置一個 lastModified 變量,代碼以下:
[php]  view plain  copy
 
  1. <!--?php  
  2. return [  
  3.     'adminEmail' =--> 'admin@example.com',  
  4.     'lastModified'    =>    1472287640,   // 設置自定義變量,用於控制http緩存  
  5. ];  
其次,在前臺控制器層 /advanced/frontend/controllers 中,添加一個控制器 HttpController.php,代碼以下:
[php]  view plain  copy
 
  1. <!--?php  
  2. namespace frontend\controllers;  
  3.   
  4. use yii\web\Controller;  
  5.   
  6. class HttpController extends Controller {  
  7.   
  8.     /* 
  9.      * 使用http緩存的控制器中,必須包含該方法 
  10.      */  
  11.     public function behaviors()  
  12.     {  
  13.         // http緩存配置  
  14.         return [  
  15.                     [  
  16.                         'class' =--> 'yii\filters\HttpCache',  
  17.                         'only' => ['index'],  // 指定http緩存對哪些action生效  
  18.                         'lastModified' => function ($action, $params) {  
  19.             //                 $q = new \yii\db\Query();  
  20.             //                 return $q->from('user')->max('updated_at');  
  21.   
  22.             //                 return 1472287616;  
  23.                             return \Yii::$app->params['lastModified'];  
  24.   
  25.                         },  
  26.   
  27.                         // 若是採用etagSeed來識別http緩存頁面是否變化,就不要用 lastModified, etagSeed操做起來更爲靈活,且也適用於非動靜分離的場景  
  28.             //            'etagSeed' => function ($action, $params) {   
  29.             //                return // generate ETag seed here  
  30. //                               return (string)($q->from('user')->max('id'));  
  31.             //            }  
  32.                     ],  
  33.         ];  
  34.     }  
  35.   
  36.     /** 
  37.      * http緩存測試 
  38.      */  
  39.     public function actionIndex(){  
  40.         echo time().'<br>';  
  41.         echo \Yii::$app->params['lastModified'];  
  42.     }  
  43.   
相關文章
相關標籤/搜索