片段快取指快取網頁某片段。例如,如果一個頁面在表格中顯示每年的銷售摘要,我們可以儲存此表在快取中,減少每次請求需要重新產生的時間。
要使用片段緩存,在控制器視圖腳本中呼叫CController::beginCache() 和CController::endCache() 。這兩種方法開始和結束所包含的頁面內容將會被快取。類似data caching ,我們需要一個編號,辨識被快取的片段。
...别的HTML内容... <?php if($this->beginCache($id)) { ?> ...被缓存的内容... <?php $this->endCache(); } ?> ...别的HTML内容...
在上面的,如果beginCache() 返回false,快取的內容將此地方自動插入; 執行否則,在if
語句內的內容將被執行時觸發快取.
當呼叫beginCache(),可以提供一個陣列由快取選項組成的作為第二個參數,以自訂片段快取。事實上為了方便,beginCache() 和endCache()方法是[ COutputCache ]widget的包裝。因此COutputCache的所有屬性都可以在快取選項中初始化。
也許是最常見的選項是duration,指定了內容在快取中多久有效。和CCache::set()過期參數有點類似。下面的程式碼快取內容片段最多一小時:
...其他HTML内容... <?php if($this->beginCache($id, array('duration'=>3600))) { ?> ...被缓存的内容... <?php $this->endCache(); } ?> ...其他HTML内容...
如果我們不設定期限,它將預設為60 ,這表示60秒後快取內容將無效。
像data caching ,內容片段被快取也可以有依賴。例如,文章的內容被顯示取決於文章是否被修改。
要指定一個依賴,我們建立了dependency選項,可以是一個實作ICacheDependency的物件或可用於產生依賴物件的配置陣列。以下的程式碼指定片段內容取決於lastModified
列的值是否變化:
...其他HTML内容... <?php if($this->beginCache($id, array('dependency'=>array( 'class'=>'system.caching.dependencies.CDbCacheDependency', 'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ?> ...被缓存的内容... <?php $this->endCache(); } ?> ...其他HTML内容...
緩存的內容可根據某些參數變化。例如,每個人的檔案都不一樣。快取的檔案內容將根據每個人ID而變化。這意味著,當呼叫beginCache()時將會用不同的ID。
COutputCache內建了這個特徵,程式設計師不需要編寫根據ID變動內容的模式。以下是摘要。
varyByRoute: 設定此選項為true ,快取的內容將根據route變化。因此,每個控制器和行動的組合將有一個單獨的快取內容。
varyBySession: 設定此選項為true ,快取的內容將根據session ID變化。因此,每個使用者會話可能會看到由快取提供的不同內容。
varyByParam: 設定此選項的陣列裡的名字,快取的內容將根據GET參數的值變動。例如,如果一個頁面顯示文章的內容根據id
的GET參數,我們可以指定varyByParam為array('id')
,以使我們能夠快取每篇文章內容。如果沒有這樣的變化,我們只能能夠快取某一文章。
varyByExpression: by setting this option to a PHP expression, we can make the cached content to be variated according to the result of this PHP expression. This option has been available since version 1.0.4.
有時候,我們希望片段快取只對某些類型的請求啟用。例如,對於某張網頁上顯示表單,我們只想要快取initially requested表單(透過GET請求)。任何隨後顯示(透過POST請求)的表單將不被緩存,因為表單可能包含使用者輸入。要做到這一點,我們可以指定requestTypes 選項:
...其他HTML内容... <?php if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ?> ...被缓存的内容... <?php $this->endCache(); } ?> ...其他HTML内容...
片段快取可以嵌套。是說一個快取片段附在一個更大的片段快取裡。例如,意見緩存在內部片段緩存,而且它們一起在外部緩存中在文章內容中緩存。
...其他HTML内容... <?php if($this->beginCache($id1)) { ?> ...外部被缓存内容... <?php if($this->beginCache($id2)) { ?> ...内部被缓存内容... <?php $this->endCache(); } ?> ...外部被缓存内容... <?php $this->endCache(); } ?> ...其他HTML内容...
巢狀快取可以設定不同的快取選項。例如, 在上面的例子中內部快取和外部快取可以設定時間長短不同的持續值。當資料儲存在外部快取無效,內部快取仍然可以提供有效的內部片段。 然而,反之就不行了。如果外部快取包含有效的數據, 它會永遠保持快取副本,即使內容中的內部快取已經過期。
以上就是Yii框架官方指南系列30-快取:片段快取(Fragment Caching)的內容,更多相關內容請關注PHP中文網(www.php.cn)!