簡介PHP的Yii框架中緩存的一些高級用法
頁面緩存
頁面緩存指的是在服務器端緩存整個頁面的內(nèi)容。隨后當同一個頁面被請求時,內(nèi)容將從緩存中取出,而不是重新生成。
頁面緩存由 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 操作時啟用,頁面內(nèi)容最多被緩存 60 秒,會隨著當前應用的語言更改而變化。如果文章總數(shù)發(fā)生變化則緩存的頁面會失效。
如你所見,頁面緩存和片段緩存極其相似。它們都支持 duration,dependencies,variations 和 enabled 配置選項。它們的主要區(qū)別是頁面緩存是由過濾器實現(xiàn),而片段緩存則是一個小部件。
你可以在使用頁面緩存的同時,使用片段緩存和動態(tài)內(nèi)容。
HTTP 緩存
除了服務器端緩存外, Web 應用還可以利用客戶端緩存去節(jié)省相同頁面內(nèi)容的生成和傳輸時間。
通過配置 yii\filters\HttpCache 過濾器,控制器操作渲染的內(nèi)容就能緩存在客戶端。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 屬性向客戶端發(fā)送 Last-Modified 頭。該屬性的值應該為 PHP callable 類型,返回的是頁面修改時的 Unix 時間戳。該 callable 的參數(shù)和返回值應該如下:
/** * @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 頁時,服務器將會生成頁面并發(fā)送至客戶端瀏覽器。之后客戶端瀏覽器在頁面沒被修改期間訪問該頁,服務器將不會重新生成頁面,瀏覽器會使用之前客戶端緩存下來的內(nèi)容。因此服務端渲染和內(nèi)容傳輸都將省去。
ETag 頭
“Entity Tag”(實體標簽,簡稱 ETag)使用一個哈希值表示頁面內(nèi)容。如果頁面被修改過,哈希值也會隨之改變。通過對比客戶端的哈希值和服務器端生成的哈希值,瀏覽器就能判斷頁面是否被修改過,進而決定是否應該重新傳輸內(nèi)容。
通過配置 yii\filters\HttpCache::etagSeed 屬性向客戶端發(fā)送 ETag 頭。該屬性的值應該為 PHP callable 類型,返回的是一段種子字符用來生成 ETag 哈希值。該 callable 的參數(shù)和返回值應該如下:
/** * @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 操作時啟用。它會基于用戶請求的標題和內(nèi)容生成一個 ETag HTTP 頭。當瀏覽器第一次訪問 view 頁時,服務器將會生成頁面并發(fā)送至客戶端瀏覽器。之后客戶端瀏覽器標題和內(nèi)容沒被修改在期間訪問該頁,服務器將不會重新生成頁面,瀏覽器會使用之前客戶端緩存下來的內(nèi)容。因此服務端渲染和內(nèi)容傳輸都將省去。
ETag 相比 Last-Modified 能實現(xiàn)更復雜和更精確的緩存策略。例如,當站點切換到另一個主題時可以使 ETag 失效。
復雜的 Etag 生成種子可能會違背使用 HttpCache 的初衷而引起不必要的性能開銷,因為響應每一次請求都需要重新計算 Etag。請試著找出一個最簡單的表達式去觸發(fā) Etag 失效。
注意:為了遵循 RFC 7232(HTTP 1.1 協(xié)議),如果同時配置了 ETag 和 Last-Modified 頭,HttpCache 將會同時發(fā)送它們。并且如果客戶端同時發(fā)送 If-None-Match 頭和 If-Modified-Since 頭,則只有前者會被接受。
Cache-Control 頭
Cache-Control 頭指定了頁面的常規(guī)緩存策略。可以通過配置 yii\filters\HttpCache::cacheControlHeader 屬性發(fā)送相應的頭信息。默認發(fā)送以下頭:
Cache-Control: public, max-age=3600
會話緩存限制器
當頁面使 session 時,PHP 將會按照 PHP.INI 中所設置的 session.cache_limiter 值自動發(fā)送一些緩存相關的 HTTP 頭。這些 HTTP 頭有可能會干擾你原本設置的 HttpCache 或讓其失效。為了避免此問題,默認情況下 HttpCache 禁止自動發(fā)送這些頭。想改變這一行為,可以配置 yii\filters\HttpCache::sessionCacheLimiter 屬性。該屬性接受一個字符串值,包括 public,private,private_no_expire,和 nocache。請參考 PHP 手冊中的緩存限制器了解這些值的含義。
SEO 影響
搜索引擎趨向于遵循站點的緩存頭。因為一些爬蟲的抓取頻率有限制,啟用緩存頭可以可以減少重復請求數(shù)量,增加爬蟲抓取效率(譯者:大意如此,但搜索引擎的排名規(guī)則不了解,好的緩存策略應該是可以為用戶體驗加分的)。
相關文章
適用于php-5.2?的?php.ini?中文版[金步國翻譯]
最近服務器基本上都是使用了php?5.2.*,以前發(fā)布的版本的php.ini已經(jīng)不適用于現(xiàn)在的版本了,特發(fā)現(xiàn)了這篇文章特分享給大家。2011-04-04
php通過function_exists檢測函數(shù)是否存在的方法
這篇文章主要介紹了php通過function_exists檢測函數(shù)是否存在的方法,實例分析了php使用function_exists檢測函數(shù)是否存在及調用的相關技巧,非常具有實用價值,需要的朋友可以參考下2015-03-03
用Zend Studio+PHPnow+Zend Debugger搭建PHP服務器調試環(huán)境步驟
作為一名非專業(yè)的PHP開發(fā)者,想要較方便地讀懂并搞清楚一個PHP功能模塊的運行細節(jié),搭建一個PHP調試環(huán)境,然后單步調試程序,以掌握程序的整個運行過程顯的尤為重要2014-01-01
PHP排序算法之基數(shù)排序(Radix Sort)實例詳解
這篇文章主要介紹了PHP排序算法之基數(shù)排序(Radix Sort),結合實例形式詳細分析了php基數(shù)排序算法的原理、實現(xiàn)方法與相關使用技巧,需要的朋友可以參考下2018-04-04

