《PHP實例:YII Framework框架教程之緩存用法詳解》要點:
本文介紹了PHP實例:YII Framework框架教程之緩存用法詳解,希望對您有用。如果有疑問,可以聯系我們。
相關主題:YII框架
本文實例講述了YII Framework框架緩存用法.分享給大家供大家參考,具體如下:PHP實例
緩存的產生原因眾所周知.于是YII作為一個高效,好用的框架,不能不支持緩存.所以YII對各種流行的緩存都提供了接口,你可以根據你的需要使用不同的緩存.PHP實例
1.YII中的緩存介紹PHP實例
YII中的緩存是通過組件方式定義的,具體在如下目錄PHP實例
/yii_dev/yii/framework/caching# tree
.
├── CApcCache.php
├── CCache.php
├── CDbCache.php
├── CDummyCache.php
├── CEAcceleratorCache.php
├── CFileCache.php
├── CMemCache.php
├── CWinCache.php
├── CXCache.php
├── CZendDataCache.php
└── dependencies
??? ├── CCacheDependency.php
??? ├── CChainedCacheDependency.php
??? ├── CDbCacheDependency.php
??? ├── CDirectoryCacheDependency.php
??? ├── CExpressionDependency.php
??? ├── CFileCacheDependency.php
??? └── CGlobalStateCacheDependency.phpPHP實例
1 directory, 17 filesPHP實例
官方原文解釋如下:PHP實例
Yii 提供了不同的緩存組件,可以將緩存數據存儲到不同的媒介中.例如, CMemCache 組件封裝了 PHP 的 memcache 擴展并使用內存作為緩存存儲媒介. CApcCache 組件封裝了 PHP APC 擴展; 而 CDbCache 組件會將緩存的數據存入數據庫.下面是一個可用緩存組件的列表:PHP實例
CMemCache: 使用 PHP memcache 擴展.PHP實例
CApcCache: 使用 PHP APC 擴展.PHP實例
CXCache: 使用 PHP XCache 擴展.注意,這個是從 1.0.1 版本開始支持的.PHP實例
CEAcceleratorCache: 使用 PHP EAccelerator 擴展.PHP實例
CDbCache: 使用一個數據表存儲緩存數據.默認情況下,它將創建并使用在 runtime 目錄下的一個 SQLite3 數據庫. 你也可以通過設置其 connectionID 屬性指定一個給它使用的數據庫.PHP實例
CZendDataCache: 使用 Zend Data Cache 作為后臺緩存媒介.注意,這個是從 1.0.4 版本開始支持的.PHP實例
CFileCache: 使用文件存儲緩存數據.這個特別適合用于存儲大塊數據(例如頁面).注意,這個是從 1.0.6 版本開始支持的.PHP實例
CDummyCache: 目前 dummy 緩存并不實現緩存功能.此組件的目的是用于簡化那些需要檢查緩存可用性的代碼. 例如,在開發階段或者服務器尚未支持實際的緩存功能,我們可以使用此緩存組件.當啟用了實際的緩存支持后,我們可以切換到使用相應的緩存組件. 在這兩種情況中,我們可以使用同樣的代碼Yii::app()->cache->get($key) 獲取數據片段而不需要擔心 Yii::app()->cache 可能會是 null.此組件從 1.0.5 版開始支持.PHP實例
提示: 由于所有的這些緩存組件均繼承自同樣的基類 CCache,因此無需改變使用緩存的那些代碼就可以切換到使用另一種緩存方式.PHP實例
緩存可以用于不同的級別.最低級別中,我們使用緩存存儲單個數據片段,例如變量,我們將此稱為 數據緩存(data caching).下一個級別中,我們在緩存中存儲一個由視圖腳本的一部分生成的頁面片段. 而在最高級別中,我們將整個頁面存儲在緩存中并在需要時取回.PHP實例
在接下來的幾個小節中,我們會詳細講解如安在這些級別中使用緩存.PHP實例
注意: 依照定義,緩存是一個不穩定的存儲媒介.即使沒有超時,它也并不確保緩存數據一定存在. 因此,不要將緩存作為持久存儲器使用.(例如,不要使用緩存存儲 Session 數據).PHP實例
2.緩存的配置和調用方式PHP實例
yii中的緩存主要是通過組件的方式實現的,具體需要配置方式可以通過緩存的類說明進行配置.PHP實例
通常是指定緩存組件的類PHP實例
例如apcPHP實例
'cache'=>array( 'class'=>'system.caching.CApcCache' ),
memcache的配置方式可能是PHP實例
* array( * 'components'=>array( * 'cache'=>array( * 'class'=>'CMemCache', * 'servers'=>array( * array( * 'host'=>'server1', * 'port'=>11211, * 'weight'=>60, * ), * array( * 'host'=>'server2', * 'port'=>11211, * 'weight'=>40, * ), * ), * ), * ), * )
使用方式:PHP實例
yii封裝了對不同緩存操作的辦法,主要集中在CCache.CCache是所有Cache類的基類.所以配置好緩存后可以調用方式很簡單:PHP實例
<?php /** * CCache is the base class for cache classes with different cache storage implementation. * * A data item can be stored in cache by calling {@link set} and be retrieved back * later by {@link get}. In both operations, a key identifying the data item is required. * An expiration time and/or a dependency can also be specified when calling {@link set}. * If the data item expires or the dependency changes, calling {@link get} will not * return back the data item. * * Note, by definition, cache does not ensure the existence of a value * even if it does not expire. Cache is not meant to be a persistent storage. * * CCache implements the interface {@link ICache} with the following methods: * <ul> * <li>{@link get} : retrieve the value with a key (if any) from cache</li> * <li>{@link set} : store the value with a key into cache</li> * <li>{@link add} : store the value only if cache does not have this key</li> * <li>{@link delete} : delete the value with the specified key from cache</li> * <li>{@link flush} : delete all values from cache</li> * </ul> * * Child classes must implement the following methods: * <ul> * <li>{@link getValue}</li> * <li>{@link setValue}</li> * <li>{@link addValue}</li> * <li>{@link deleteValue}</li> * <li>{@link flush} (optional)</li> * </ul> * * CCache also implements ArrayAccess so that it can be used like an array. * * @author Qiang Xue <qiang.xue@gmail.com> * @version $Id: CCache.php 3001 2011-02-24 16:42:44Z alexander.makarow $ * @package system.caching * @since 1.0 */ abstract class CCache extends CApplicationComponent implements ICache, ArrayAccess {
根據CCache類說明可以看出,常見的緩存操作辦法get,set,add,delete,flushPHP實例
/** * Retrieves a value from cache with a specified key. * @param string $id a key identifying the cached value * @return mixed the value stored in cache, false if the value is not in the cache, expired or the dependency has changed. */ public function get($id) { if(($value=$this->getValue($this->generateUniqueKey($id)))!==false) { $data=unserialize($value); if(!is_array($data)) return false; if(!($data[1] instanceof ICacheDependency) || !$data[1]->getHasChanged()) { Yii::trace('Serving "'.$id.'" from cache','system.caching.'.get_class($this)); return $data[0]; } } return false; } /** * Retrieves multiple values from cache with the specified keys. * Some caches (such as memcache, apc) allow retrieving multiple cached values at one time, * which may improve the performance since it reduces the communication cost. * In case a cache doesn't support this feature natively, it will be simulated by this method. * @param array $ids list of keys identifying the cached values * @return array list of cached values corresponding to the specified keys. The array * is returned in terms of (key,value) pairs. * If a value is not cached or expired, the corresponding array value will be false. * @since 1.0.8 */ public function mget($ids) { $uniqueIDs=array(); $results=array(); foreach($ids as $id) { $uniqueIDs[$id]=$this->generateUniqueKey($id); $results[$id]=false; } $values=$this->getValues($uniqueIDs); foreach($uniqueIDs as $id=>$uniqueID) { if(!isset($values[$uniqueID])) continue; $data=unserialize($values[$uniqueID]); if(is_array($data) && (!($data[1] instanceof ICacheDependency) || !$data[1]->getHasChanged())) { Yii::trace('Serving "'.$id.'" from cache','system.caching.'.get_class($this)); $results[$id]=$data[0]; } } return $results; } /** * Stores a value identified by a key into cache. * If the cache already contains such a key, the existing value and * expiration time will be replaced with the new ones. * * @param string $id the key identifying the value to be cached * @param mixed $value the value to be cached * @param integer $expire the number of seconds in which the cached value will expire. 0 means never expire. * @param ICacheDependency $dependency dependency of the cached item. If the dependency changes, the item is labeled invalid. * @return boolean true if the value is successfully stored into cache, false otherwise */ public function set($id,$value,$expire=0,$dependency=null) { Yii::trace('Saving "'.$id.'" to cache','system.caching.'.get_class($this)); if($dependency!==null) $dependency->evaluateDependency(); $data=array($value,$dependency); return $this->setValue($this->generateUniqueKey($id),serialize($data),$expire); } /** * Stores a value identified by a key into cache if the cache does not contain this key. * Nothing will be done if the cache already contains the key. * @param string $id the key identifying the value to be cached * @param mixed $value the value to be cached * @param integer $expire the number of seconds in which the cached value will expire. 0 means never expire. * @param ICacheDependency $dependency dependency of the cached item. If the dependency changes, the item is labeled invalid. * @return boolean true if the value is successfully stored into cache, false otherwise */ public function add($id,$value,$expire=0,$dependency=null) { Yii::trace('Adding "'.$id.'" to cache','system.caching.'.get_class($this)); if($dependency!==null) $dependency->evaluateDependency(); $data=array($value,$dependency); return $this->addValue($this->generateUniqueKey($id),serialize($data),$expire); } /** * Deletes a value with the specified key from cache * @param string $id the key of the value to be deleted * @return boolean if no error happens during deletion */ public function delete($id) { Yii::trace('Deleting "'.$id.'" from cache','system.caching.'.get_class($this)); return $this->deleteValue($this->generateUniqueKey($id)); } /** * Deletes all values from cache. * Be careful of performing this operation if the cache is shared by multiple applications. * @return boolean whether the flush operation was successful. */ public function flush() { Yii::trace('Flushing cache','system.caching.'.get_class($this)); return $this->flushValues(); }
即:PHP實例
Yii::app()->cache->xxx
xxx對應具體的辦法.PHP實例
例如:PHP實例
$id = 'key1'; $value = 'cache value'; Yii::app()->cache->add($id, $value); var_dump(Yii::app()->cache->get($id));
下面是yii官方給出的幾種緩存方式的使用說明,這里就麻木不仁,照搬了PHP實例
3.緩存的使用:數據緩存PHP實例
數據緩存PHP實例
數據緩存即存儲一些 PHP 變量到緩存中,以后再從緩存中取出來.出于此目的,緩存組件的基類 CCache 提供了兩個最常用的辦法: set() 和 get().PHP實例
要在緩存中存儲一個變量 $value ,我們選擇一個唯一 ID 并調用 set() 存儲它:PHP實例
Yii::app()->cache->set($id, $value);
緩存的數據將一直留在緩存中,除非它由于某些緩存策略(例如緩存空間已滿,舊的數據被刪除)而被清除. 要改變這種行為,我們可以在調用 set() 的同時提供一個過期參數,這樣在設定的時間段之后,緩存數據將被清除:PHP實例
// 值$value 在緩存中最多保留30秒 Yii::app()->cache->set($id, $value, 30);
稍后當我們需要訪問此變量時(在同一個或不同的 Web 哀求中),就可以通過 ID 調用 get() 從緩存中將其取回. 如果返回的是 false,表示此值在緩存中不可用,我們應該重新生成它.PHP實例
$value=Yii::app()->cache->get($id); if($value===false) { // 因為在緩存中沒找到 $value ,重新生成它 , // 并將它存入緩存以備以后使用: // Yii::app()->cache->set($id,$value); }
為要存入緩存的變量選擇 ID 時,要確保此 ID 對應用中所有其他存入緩存的變量是唯一的. 而在不同的應用之間,這個 ID 不需要是唯一的.緩存組件具有足夠的智慧區分不同應用中的 ID.PHP實例
一些緩存存儲器,例如 MemCache, APC, 支持以批量模式獲取多個緩存值.這可以減少獲取緩存數據時帶來的開銷. 從版本 1.0.8 起,Yii 提供了一個新的名為 mget() 的辦法.它可以利用此功能.如果底層緩存存儲器不支持此功能,mget() 依然可以模擬實現它.PHP實例
要從緩存中清除一個緩存值,調用 delete(); 要清楚緩存中的所有數據,調用 flush(). 當調用 flush() 時一定要小心,因為它會同時清除其他應用中的緩存.PHP實例
提示: 由于 CCache 實現了 ArrayAccess,緩存組件也可以像一個數組一樣使用.下面是幾個例子:PHP實例
$cache=Yii::app()->cache; $cache['var1']=$value1; // 相當于: $cache->set('var1',$value1); $value2=$cache['var2']; // 相當于: $value2=$cache->get('var2');
1. 緩存依賴PHP實例
除了過期設置,緩存數據也可能會因為依賴條件發生變化而失效.例如,如果我們緩存了某些文件的內容,而這些文件發生了改變,我們就應該讓緩存的數據失效, 并從文件中讀取最新內容而不是從緩存中讀取.PHP實例
我們將一個依賴關系表現為一個 CCacheDependency 或其子類的實例. 當調用 set() 時,我們連同要緩存的數據將其一同傳入.PHP實例
// 此值將在30秒后失效 // 也可能因依賴的文件發生了變化而更快失效 Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency('FileName'));
現在如果我們通過調用get() 從緩存中獲取 $value ,依賴關系將被檢查,如果發生改變,我們將會得到一個 false 值,表示數據需要被重新生成.PHP實例
如下是可用的緩存依賴的簡要說明:PHP實例
CFileCacheDependency: 如果文件的最后修改時間發生改變,則依賴改變.
CDirectoryCacheDependency: 如果目錄和其子目錄中的文件發生改變,則依賴改變.
CDbCacheDependency: 如果指定 SQL 語句的查詢結果發生改變,則依賴改變.
CGlobalStateCacheDependency: 如果指定的全局狀態發生改變,則依賴改變.全局狀態是應用中的一個跨哀求,跨會話的變量.它是通過 CApplication::setGlobalState() 定義的.
CChainedCacheDependency: 如果鏈中的任何依賴發生改變,則此依賴改變.
CExpressionDependency: 如果指定的 PHP 表達式的結果發生改變,則依賴改變.此類從版本 1.0.4 起可用.PHP實例
4.緩存的使用:片段緩存PHP實例
片段緩存(Fragment Caching)PHP實例
片段緩存指緩存網頁某片段.例如,如果一個頁面在表中顯示每年的銷售摘要,我們可以存儲此表在緩存中,減少每次哀求需要重新產生的時間.PHP實例
要使用片段緩存,在控制器視圖腳本中調用CController::beginCache() 和CController::endCache() .這兩種辦法開始和結束包括的頁面內容將被緩存.類似data caching ,我們需要一個編號,識別被緩存的片段.PHP實例
...別的HTML內容... <?php if($this->beginCache($id)) { ?> ...被緩存的內容... <?php $this->endCache(); } ?> ...別的HTML內容...
在上面的,如果beginCache() 返回false,緩存的內容將此地方自動插入; 否則,在if語句內的內容將被執行并在endCache()觸發時緩存.PHP實例
1. 緩存選項(Caching Options)PHP實例
當調用beginCache(),可以提供一個數組由緩存選項組成的作為第二個參數,以自定義片段緩存.事實上為了方便,beginCache() 和endCache()辦法是[ COutputCache ]widget的包裝.因此COutputCache的所有屬性都可以在緩存選項中初始化.PHP實例
有效期(Duration)PHP實例
也許是最常見的選項是duration,指定了內容在緩存中多久有效.和CCache::set()過期參數有點類似.下面的代碼緩存內容片段最多一小時:PHP實例
...其他HTML內容... <?php if($this->beginCache($id, array('duration'=>3600))) { ?> ...被緩存的內容... <?php $this->endCache(); } ?> ...其他HTML內容...
如果我們不設定期限,它將默認為60 ,這意味著60秒后緩存內容將無效.PHP實例
依賴(Dependency)PHP實例
像data caching ,內容片段被緩存也可以有依賴.例如,文章的內容被顯示取決于文章是否被修改.PHP實例
要指定一個依賴,我們建立了dependency選項,可以是一個實現[ICacheDependency]的對象或可用于生成依賴對象的配置數組.下面的代碼指定片段內容取決于lastModified 列的值是否變化:PHP實例
...其他HTML內容... <?php if($this->beginCache($id, array('dependency'=>array( 'class'=>'system.caching.dependencies.CDbCacheDependency', 'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ?> ...被緩存的內容... <?php $this->endCache(); } ?> ...其他HTML內容...
變化(Variation)PHP實例
緩存的內容可根據一些參數變化.例如,每個人的檔案都不一樣.緩存的檔案內容將根據每個人ID變化.這意味著,當調用beginCache()時將用不同的ID.PHP實例
COutputCache內置了這一特征,程序員不需要編寫根據ID變動內容的模式.以下是摘要.PHP實例
varyByRoute: 設置此選項為true ,緩存的內容將根據route變化.因此,每個控制器和行動的組合將有一個單獨的緩存內容.
varyBySession: 設置此選項為true ,緩存的內容將根據session ID變化.因此,每個用戶會話可能會看到由緩存提供的不同內容.
varyByParam: 設置此選項的數組里的名字,緩存的內容將根據GET參數的值變動.例如,如果一個頁面顯示文章的內容根據id的GET參數,我們可以指定varyByParam為array('id'),以使我們能夠緩存每篇文章內容.如果沒有這樣的變化,我們只能能夠緩存某一文章.PHP實例
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.
Request TypesPHP實例
有時候,我們希望片段緩存只對某些類型的哀求啟用.例如,對于某張網頁上顯示表單,我們只想要緩存initially requested表單(通過GET哀求).任何隨后顯示(通過POST哀求)的表單將不被緩存,因為表單可能包含用戶輸入.要做到這一點,我們可以指定requestTypes 選項:PHP實例
...其他HTML內容... <?php if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ?> ...被緩存的內容... <?php $this->endCache(); } ?> ...其他HTML內容...
2. 嵌套緩存(Nested Caching)PHP實例
片段緩存可以嵌套.就是說一個緩存片段附在一個更大的片段緩存里.例如,意見緩存在內部片段緩存,而且它們一起在外部緩存中在文章內容里緩存.PHP實例
...其他HTML內容... <?php if($this->beginCache($id1)) { ?> ...外部被緩存內容... <?php if($this->beginCache($id2)) { ?> ...內部被緩存內容... <?php $this->endCache(); } ?> ...外部被緩存內容... <?php $this->endCache(); } ?> ...其他HTML內容...
嵌套緩存可以設定不同的緩存選項.例如, 在上面的例子中內部緩存和外部緩存可以設置時間長短不同的持續值.當數據存儲在外部緩存無效,內部緩存仍然可以提供有效的內部片段. 然而,反之就不行了.如果外部緩存包含有效的數據, 它會永遠保持緩存副本,即使內容中的內部緩存已經過期.PHP實例
5.緩存的使用:頁面緩存PHP實例
頁面緩存PHP實例
頁面緩存指的是緩存整個頁面的內容.頁面緩存可以發生在不同的地方. 例如,通過選擇適當的頁面頭,客戶端的瀏覽器可能會緩存網頁瀏覽有限時間. Web應用程序本身也可以在緩存中存儲網頁內容. 在本節中,我們側重于后一種方法.PHP實例
頁面緩存可以被看作是 片段緩存一個特殊情況 . 由于網頁內容是往往通過應用布局來生成,如果我們只是簡單的在布局中調用beginCache() 和endCache(),將無法正常工作. 這是因為布局在CController::render()辦法里的加載是在頁面內容產生之后.PHP實例
如果想要緩存整個頁面,我們應該跳過產生網頁內容的動作執行.我們可以使用COutputCache作為動作 過濾器來完成這一任務.下面的代碼演示如何配置緩存過濾器:PHP實例
public function filters() { return array( array( 'COutputCache', 'duration'=>100, 'varyByParam'=>array('id'), ), ); }
上述過濾器配置會使過濾器適用于控制器中的所有行動. 我們可能會限制它在一個或幾個行動通過使用插件操作器. 更多的細節中可以看過濾器.PHP實例
Tip: 我們可以使用COutputCache作為一個過濾器,因為它從CFilterWidget繼承過來, 這意味著它是一個工具(widget)和一個過濾器.事實上,widget的工作方式和過濾器非常相似: 工具widget (過濾器filter)是在action動作里的內容執行前執行,在執行后結束.PHP實例
6.緩存的使用:動態內容PHP實例
動態內容(Dynamic Content)PHP實例
當使用fragment caching或page caching,我們常常遇到的這樣的情況 整個部分的輸出除了個別地方都是靜態的.例如,贊助頁可能會顯示靜態的贊助 信息,而用戶名稱顯示的是當前用戶的.PHP實例
解決這個問題,我們可以根據用戶名匹配緩存內容,但是這將是我們寶貴空間一個巨大的浪費,因為緩存除了用戶名其他大部分內容是相同的.我們還可以把網頁切成幾個片段并分別緩存,但這種情況會使頁面和代碼變得非常復雜.更好的辦法是使用由[ CController ]提供的動態內容dynamic content功能 .PHP實例
動態內容是指片段輸出即使是在片段緩存包括的內容中也不會被緩存.即使是包括的內容是從緩存中取出,為了使動態內容在所有時間是動態的,每次都得重新生成.出于這個原因,我們要求 動態內容通過一些辦法或函數生成.PHP實例
調用CController::renderDynamic()在你想的地方插入動態內容.PHP實例
...別的HTML內容... <?php if($this->beginCache($id)) { ?> ...被緩存的片段內容... <?php $this->renderDynamic($callback); ?> ...被緩存的片段內容... <?php $this->endCache(); } ?> ...別的HTML內容...
在上面的, $callback指的是有效的PHP回調.它可以是指向當前控制器類的辦法或者全局函數的字符串名.它也可以是一個數組名指向一個類的辦法.其他任何的參數,將傳遞到renderDynamic()辦法中.回調將返回動態內容而不是僅僅顯示它.PHP實例
更多關于Yii相關內容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結》、《php優秀開發框架總結》、《smarty模板入門基礎教程》、《php日期與時間用法總結》、《php面向對象程序設計入門教程》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》PHP實例
希望本文所述對大家基于Yii框架的PHP程序設計有所贊助.PHP實例
維易PHP培訓學院每天發布《PHP實例:YII Framework框架教程之緩存用法詳解》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。