<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 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 協議)](http://tools.ietf.org/html/rfc7232#section-2.4),如果同時配置了?`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 手冊中的[緩存限制器](http://www.php.net/manual/en/function.session-cache-limiter.php)了解這些值的含義。 ## SEO 影響 搜索引擎趨向于遵循站點的緩存頭。因為一些爬蟲的抓取頻率有限制,啟用緩存頭可以可以減少重復請求數量,增加爬蟲抓取效率(譯者:大意如此,但搜索引擎的排名規則不了解,好的緩存策略應該是可以為用戶體驗加分的)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看