国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 php教程 PHP開發(fā) YII Framework框架教程之緩存用法詳解

YII Framework框架教程之緩存用法詳解

Dec 27, 2016 pm 02:04 PM

本文實(shí)例講述了YII Framework框架緩存用法。分享給大家供大家參考,具體如下:

緩存的產(chǎn)生原因眾所周知。于是YII作為一個(gè)高效,好用的框架,不能不支持緩存。所以YII對各種流行的緩存都提供了接口,你可以根據(jù)你的需要使用不同的緩存。

1.YII中的緩存介紹

YII中的緩存是通過組件方式定義的,具體在如下目錄

/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.php

1 directory, 17 files

官方原文解釋如下:

Yii 提供了不同的緩存組件,可以將緩存數(shù)據(jù)存儲(chǔ)到不同的媒介中。例如, CMemCache 組件封裝了 PHP 的 memcache 擴(kuò)展并使用內(nèi)存作為緩存存儲(chǔ)媒介。 CApcCache 組件封裝了 PHP APC 擴(kuò)展; 而 CDbCache 組件會(huì)將緩存的數(shù)據(jù)存入數(shù)據(jù)庫。下面是一個(gè)可用緩存組件的列表:

CMemCache: 使用 PHP memcache 擴(kuò)展.

CApcCache: 使用 PHP APC 擴(kuò)展.

CXCache: 使用 PHP XCache 擴(kuò)展。注意,這個(gè)是從 1.0.1 版本開始支持的。

CEAcceleratorCache: 使用 PHP EAccelerator 擴(kuò)展.

CDbCache: 使用一個(gè)數(shù)據(jù)表存儲(chǔ)緩存數(shù)據(jù)。默認(rèn)情況下,它將創(chuàng)建并使用在 runtime 目錄下的一個(gè) SQLite3 數(shù)據(jù)庫。 你也可以通過設(shè)置其 connectionID 屬性指定一個(gè)給它使用的數(shù)據(jù)庫。

CZendDataCache: 使用 Zend Data Cache 作為后臺(tái)緩存媒介。注意,這個(gè)是從 1.0.4 版本開始支持的。

CFileCache: 使用文件存儲(chǔ)緩存數(shù)據(jù)。這個(gè)特別適合用于存儲(chǔ)大塊數(shù)據(jù)(例如頁面)。注意,這個(gè)是從 1.0.6 版本開始支持的。

CDummyCache: 目前 dummy 緩存并不實(shí)現(xiàn)緩存功能。此組件的目的是用于簡化那些需要檢查緩存可用性的代碼。 例如,在開發(fā)階段或者服務(wù)器尚未支持實(shí)際的緩存功能,我們可以使用此緩存組件。當(dāng)啟用了實(shí)際的緩存支持后,我們可以切換到使用相應(yīng)的緩存組件。 在這兩種情況中,我們可以使用同樣的代碼Yii::app()->cache->get($key) 獲取數(shù)據(jù)片段而不需要擔(dān)心 Yii::app()->cache 可能會(huì)是 null。此組件從 1.0.5 版開始支持。

提示: 由于所有的這些緩存組件均繼承自同樣的基類 CCache,因此無需改變使用緩存的那些代碼就可以切換到使用另一種緩存方式。

緩存可以用于不同的級(jí)別。最低級(jí)別中,我們使用緩存存儲(chǔ)單個(gè)數(shù)據(jù)片段,例如變量,我們將此稱為 數(shù)據(jù)緩存(data caching)。下一個(gè)級(jí)別中,我們在緩存中存儲(chǔ)一個(gè)由視圖腳本的一部分生成的頁面片段。 而在最高級(jí)別中,我們將整個(gè)頁面存儲(chǔ)在緩存中并在需要時(shí)取回。

在接下來的幾個(gè)小節(jié)中,我們會(huì)詳細(xì)講解如何在這些級(jí)別中使用緩存。

注意: 按照定義,緩存是一個(gè)不穩(wěn)定的存儲(chǔ)媒介。即使沒有超時(shí),它也并不確保緩存數(shù)據(jù)一定存在。 因此,不要將緩存作為持久存儲(chǔ)器使用。(例如,不要使用緩存存儲(chǔ) Session 數(shù)據(jù))。

2.緩存的配置和調(diào)用方式

yii中的緩存主要是通過組件的方式實(shí)現(xiàn)的,具體需要配置方式可以通過緩存的類說明進(jìn)行配置。

通常是指定緩存組件的類

例如apc

'cache'=>array(
  'class'=>'system.caching.CApcCache'
),

memcache的配置方式可能是

* array(
*   'components'=>array(
*     'cache'=>array(
*       'class'=>'CMemCache',
*       'servers'=>array(
*         array(
*           'host'=>'server1',
*           'port'=>11211,
*           'weight'=>60,
*         ),
*         array(
*           'host'=>'server2',
*           'port'=>11211,
*           'weight'=>40,
*         ),
*       ),
*     ),
*   ),
* )

使用方式:

yii封裝了對不同緩存操作的方法,主要集中在CCache。CCache是所有Cache類的基類。所以配置好緩存后可以調(diào)用方式很簡單:

<?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
{

根據(jù)CCache類說明可以看出,常見的緩存操作方法get,set,add,delete,flush

/**
 * 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(&#39;Serving "&#39;.$id.&#39;" from cache&#39;,&#39;system.caching.&#39;.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&#39;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(&#39;Serving "&#39;.$id.&#39;" from cache&#39;,&#39;system.caching.&#39;.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(&#39;Saving "&#39;.$id.&#39;" to cache&#39;,&#39;system.caching.&#39;.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(&#39;Adding "&#39;.$id.&#39;" to cache&#39;,&#39;system.caching.&#39;.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(&#39;Deleting "&#39;.$id.&#39;" from cache&#39;,&#39;system.caching.&#39;.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(&#39;Flushing cache&#39;,&#39;system.caching.&#39;.get_class($this));
  return $this->flushValues();
}

即:

Yii::app()->cache->xxx

xxx對應(yīng)具體的方法。

例如:

$id = &#39;key1&#39;;
$value = &#39;cache value&#39;;
Yii::app()->cache->add($id, $value);
var_dump(Yii::app()->cache->get($id));

下面是yii官方給出的幾種緩存方式的使用說明,這里就麻木不仁,照搬了

3.緩存的使用:數(shù)據(jù)緩存

數(shù)據(jù)緩存

數(shù)據(jù)緩存即存儲(chǔ)一些 PHP 變量到緩存中,以后再從緩存中取出來。出于此目的,緩存組件的基類 CCache 提供了兩個(gè)最常用的方法: set() 和 get()。

要在緩存中存儲(chǔ)一個(gè)變量 $value ,我們選擇一個(gè)唯一 ID 并調(diào)用 set() 存儲(chǔ)它:

Yii::app()->cache->set($id, $value);

緩存的數(shù)據(jù)將一直留在緩存中,除非它由于某些緩存策略(例如緩存空間已滿,舊的數(shù)據(jù)被刪除)而被清除。 要改變這種行為,我們可以在調(diào)用 set() 的同時(shí)提供一個(gè)過期參數(shù),這樣在設(shè)定的時(shí)間段之后,緩存數(shù)據(jù)將被清除:

// 值$value 在緩存中最多保留30秒
Yii::app()->cache->set($id, $value, 30);

稍后當(dāng)我們需要訪問此變量時(shí)(在同一個(gè)或不同的 Web 請求中),就可以通過 ID 調(diào)用 get() 從緩存中將其取回。 如果返回的是 false,表示此值在緩存中不可用,我們應(yīng)該重新生成它。

$value=Yii::app()->cache->get($id);
if($value===false)
{
  // 因?yàn)樵诰彺嬷袥]找到 $value ,重新生成它 ,
  // 并將它存入緩存以備以后使用:
  // Yii::app()->cache->set($id,$value);
}

為要存入緩存的變量選擇 ID 時(shí),要確保此 ID 對應(yīng)用中所有其他存入緩存的變量是唯一的。 而在不同的應(yīng)用之間,這個(gè) ID 不需要是唯一的。緩存組件具有足夠的智慧區(qū)分不同應(yīng)用中的 ID。

一些緩存存儲(chǔ)器,例如 MemCache, APC, 支持以批量模式獲取多個(gè)緩存值。這可以減少獲取緩存數(shù)據(jù)時(shí)帶來的開銷。 從版本 1.0.8 起,Yii 提供了一個(gè)新的名為 mget() 的方法。它可以利用此功能。如果底層緩存存儲(chǔ)器不支持此功能,mget() 依然可以模擬實(shí)現(xiàn)它。

要從緩存中清除一個(gè)緩存值,調(diào)用 delete(); 要清楚緩存中的所有數(shù)據(jù),調(diào)用 flush()。 當(dāng)調(diào)用 flush() 時(shí)一定要小心,因?yàn)樗鼤?huì)同時(shí)清除其他應(yīng)用中的緩存。

提示: 由于 CCache 實(shí)現(xiàn)了 ArrayAccess,緩存組件也可以像一個(gè)數(shù)組一樣使用。下面是幾個(gè)例子:

$cache=Yii::app()->cache;
$cache[&#39;var1&#39;]=$value1; // 相當(dāng)于: $cache->set(&#39;var1&#39;,$value1);
$value2=$cache[&#39;var2&#39;]; // 相當(dāng)于: $value2=$cache->get(&#39;var2&#39;);

1. 緩存依賴

除了過期設(shè)置,緩存數(shù)據(jù)也可能會(huì)因?yàn)橐蕾嚄l件發(fā)生變化而失效。例如,如果我們緩存了某些文件的內(nèi)容,而這些文件發(fā)生了改變,我們就應(yīng)該讓緩存的數(shù)據(jù)失效, 并從文件中讀取最新內(nèi)容而不是從緩存中讀取。

我們將一個(gè)依賴關(guān)系表現(xiàn)為一個(gè) CCacheDependency 或其子類的實(shí)例。 當(dāng)調(diào)用 set() 時(shí),我們連同要緩存的數(shù)據(jù)將其一同傳入。

// 此值將在30秒后失效
// 也可能因依賴的文件發(fā)生了變化而更快失效
Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency(&#39;FileName&#39;));

現(xiàn)在如果我們通過調(diào)用get() 從緩存中獲取 $value ,依賴關(guān)系將被檢查,如果發(fā)生改變,我們將會(huì)得到一個(gè) false 值,表示數(shù)據(jù)需要被重新生成。

如下是可用的緩存依賴的簡要說明:

CFileCacheDependency: 如果文件的最后修改時(shí)間發(fā)生改變,則依賴改變。
CDirectoryCacheDependency: 如果目錄和其子目錄中的文件發(fā)生改變,則依賴改變。
CDbCacheDependency: 如果指定 SQL 語句的查詢結(jié)果發(fā)生改變,則依賴改變。
CGlobalStateCacheDependency: 如果指定的全局狀態(tài)發(fā)生改變,則依賴改變。全局狀態(tài)是應(yīng)用中的一個(gè)跨請求,跨會(huì)話的變量。它是通過 CApplication::setGlobalState() 定義的。
CChainedCacheDependency: 如果鏈中的任何依賴發(fā)生改變,則此依賴改變。
CExpressionDependency: 如果指定的 PHP 表達(dá)式的結(jié)果發(fā)生改變,則依賴改變。此類從版本 1.0.4 起可用。

4.緩存的使用:片段緩存

片段緩存(Fragment Caching)

片段緩存指緩存網(wǎng)頁某片段。例如,如果一個(gè)頁面在表中顯示每年的銷售摘要,我們可以存儲(chǔ)此表在緩存中,減少每次請求需要重新產(chǎn)生的時(shí)間。

要使用片段緩存,在控制器視圖腳本中調(diào)用CController::beginCache() 和CController::endCache() 。這兩種方法開始和結(jié)束包括的頁面內(nèi)容將被緩存。類似data caching ,我們需要一個(gè)編號(hào),識(shí)別被緩存的片段。

...別的HTML內(nèi)容...
<?php if($this->beginCache($id)) { ?>
...被緩存的內(nèi)容...
<?php $this->endCache(); } ?>
...別的HTML內(nèi)容...

如果我們不設(shè)定期限,它將默認(rèn)為60 ,這意味著60秒后緩存內(nèi)容將無效。

依賴(Dependency)

像data caching ,內(nèi)容片段被緩存也可以有依賴。例如,文章的內(nèi)容被顯示取決于文章是否被修改。

要指定一個(gè)依賴,我們建立了dependency選項(xiàng),可以是一個(gè)實(shí)現(xiàn)[ICacheDependency]的對象或可用于生成依賴對象的配置數(shù)組。下面的代碼指定片段內(nèi)容取決于lastModified 列的值是否變化:

...其他HTML內(nèi)容...
<?php if($this->beginCache($id, array(&#39;dependency&#39;=>array(
    &#39;class&#39;=>&#39;system.caching.dependencies.CDbCacheDependency&#39;,
    &#39;sql&#39;=>&#39;SELECT MAX(lastModified) FROM Post&#39;)))) { ?>
...被緩存的內(nèi)容...
<?php $this->endCache(); } ?>
...其他HTML內(nèi)容...

變化(Variation)

緩存的內(nèi)容可根據(jù)一些參數(shù)變化。例如,每個(gè)人的檔案都不一樣。緩存的檔案內(nèi)容將根據(jù)每個(gè)人ID變化。這意味著,當(dāng)調(diào)用beginCache()時(shí)將用不同的ID。

COutputCache內(nèi)置了這一特征,程序員不需要編寫根據(jù)ID變動(dòng)內(nèi)容的模式。以下是摘要。

varyByRoute: 設(shè)置此選項(xiàng)為true ,緩存的內(nèi)容將根據(jù)route變化。因此,每個(gè)控制器和行動(dòng)的組合將有一個(gè)單獨(dú)的緩存內(nèi)容。
varyBySession: 設(shè)置此選項(xiàng)為true ,緩存的內(nèi)容將根據(jù)session ID變化。因此,每個(gè)用戶會(huì)話可能會(huì)看到由緩存提供的不同內(nèi)容。
varyByParam: 設(shè)置此選項(xiàng)的數(shù)組里的名字,緩存的內(nèi)容將根據(jù)GET參數(shù)的值變動(dòng)。例如,如果一個(gè)頁面顯示文章的內(nèi)容根據(jù)id的GET參數(shù),我們可以指定varyByParam為array('id'),以使我們能夠緩存每篇文章內(nèi)容。如果沒有這樣的變化,我們只能能夠緩存某一文章。

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 Types

有時(shí)候,我們希望片段緩存只對某些類型的請求啟用。例如,對于某張網(wǎng)頁上顯示表單,我們只想要緩存initially requested表單(通過GET請求)。任何隨后顯示(通過POST請求)的表單將不被緩存,因?yàn)楸韱慰赡馨脩糨斎?。要做到這一點(diǎn),我們可以指定requestTypes 選項(xiàng):

...其他HTML內(nèi)容...
<?php if($this->beginCache($id, array(&#39;requestTypes&#39;=>array(&#39;GET&#39;)))) { ?>
...被緩存的內(nèi)容...
<?php $this->endCache(); } ?>
...其他HTML內(nèi)容...

2. 嵌套緩存(Nested Caching)

片段緩存可以嵌套。就是說一個(gè)緩存片段附在一個(gè)更大的片段緩存里。例如,意見緩存在內(nèi)部片段緩存,而且它們一起在外部緩存中在文章內(nèi)容里緩存。

...其他HTML內(nèi)容...
<?php if($this->beginCache($id1)) { ?>
...外部被緩存內(nèi)容...
  <?php if($this->beginCache($id2)) { ?>
  ...內(nèi)部被緩存內(nèi)容...
  <?php $this->endCache(); } ?>
...外部被緩存內(nèi)容...
<?php $this->endCache(); } ?>
...其他HTML內(nèi)容...

嵌套緩存可以設(shè)定不同的緩存選項(xiàng)。例如, 在上面的例子中內(nèi)部緩存和外部緩存可以設(shè)置時(shí)間長短不同的持續(xù)值。當(dāng)數(shù)據(jù)存儲(chǔ)在外部緩存無效,內(nèi)部緩存仍然可以提供有效的內(nèi)部片段。 然而,反之就不行了。如果外部緩存包含有效的數(shù)據(jù), 它會(huì)永遠(yuǎn)保持緩存副本,即使內(nèi)容中的內(nèi)部緩存已經(jīng)過期。

5.緩存的使用:頁面緩存

頁面緩存

頁面緩存指的是緩存整個(gè)頁面的內(nèi)容。頁面緩存可以發(fā)生在不同的地方。 例如,通過選擇適當(dāng)?shù)捻撁骖^,客戶端的瀏覽器可能會(huì)緩存網(wǎng)頁瀏覽有限時(shí)間。 Web應(yīng)用程序本身也可以在緩存中存儲(chǔ)網(wǎng)頁內(nèi)容。 在本節(jié)中,我們側(cè)重于后一種辦法。

頁面緩存可以被看作是 片段緩存一個(gè)特殊情況 。 由于網(wǎng)頁內(nèi)容是往往通過應(yīng)用布局來生成,如果我們只是簡單的在布局中調(diào)用beginCache() 和endCache(),將無法正常工作。 這是因?yàn)椴季衷贑Controller::render()方法里的加載是在頁面內(nèi)容產(chǎn)生之后。

如果想要緩存整個(gè)頁面,我們應(yīng)該跳過產(chǎn)生網(wǎng)頁內(nèi)容的動(dòng)作執(zhí)行。我們可以使用COutputCache作為動(dòng)作 過濾器來完成這一任務(wù)。下面的代碼演示如何配置緩存過濾器:

public function filters()
{
  return array(
    array(
      &#39;COutputCache&#39;,
      &#39;duration&#39;=>100,
      &#39;varyByParam&#39;=>array(&#39;id&#39;),
    ),
  );
}

上述過濾器配置會(huì)使過濾器適用于控制器中的所有行動(dòng)。 我們可能會(huì)限制它在一個(gè)或幾個(gè)行動(dòng)通過使用插件操作器。 更多的細(xì)節(jié)中可以看過濾器。

Tip: 我們可以使用COutputCache作為一個(gè)過濾器,因?yàn)樗鼜腃FilterWidget繼承過來, 這意味著它是一個(gè)工具(widget)和一個(gè)過濾器。事實(shí)上,widget的工作方式和過濾器非常相似: 工具widget (過濾器filter)是在action動(dòng)作里的內(nèi)容執(zhí)行前執(zhí)行,在執(zhí)行后結(jié)束。

6.緩存的使用:動(dòng)態(tài)內(nèi)容

動(dòng)態(tài)內(nèi)容(Dynamic Content)

當(dāng)使用fragment caching或page caching,我們常常遇到的這樣的情況 整個(gè)部分的輸出除了個(gè)別地方都是靜態(tài)的。例如,幫助頁可能會(huì)顯示靜態(tài)的幫助 信息,而用戶名稱顯示的是當(dāng)前用戶的。

解決這個(gè)問題,我們可以根據(jù)用戶名匹配緩存內(nèi)容,但是這將是我們寶貴空間一個(gè)巨大的浪費(fèi),因?yàn)榫彺娉擞脩裘渌蟛糠謨?nèi)容是相同的。我們還可以把網(wǎng)頁切成幾個(gè)片段并分別緩存,但這種情況會(huì)使頁面和代碼變得非常復(fù)雜。更好的方法是使用由[ CController ]提供的動(dòng)態(tài)內(nèi)容dynamic content功能 。

動(dòng)態(tài)內(nèi)容是指片段輸出即使是在片段緩存包括的內(nèi)容中也不會(huì)被緩存。即使是包括的內(nèi)容是從緩存中取出,為了使動(dòng)態(tài)內(nèi)容在所有時(shí)間是動(dòng)態(tài)的,每次都得重新生成。出于這個(gè)原因,我們要求 動(dòng)態(tài)內(nèi)容通過一些方法或函數(shù)生成。

調(diào)用CController::renderDynamic()在你想的地方插入動(dòng)態(tài)內(nèi)容。

...別的HTML內(nèi)容...
<?php if($this->beginCache($id)) { ?>
...被緩存的片段內(nèi)容...
  <?php $this->renderDynamic($callback); ?>
...被緩存的片段內(nèi)容...
<?php $this->endCache(); } ?>
...別的HTML內(nèi)容...

在上面的, $callback指的是有效的PHP回調(diào)。它可以是指向當(dāng)前控制器類的方法或者全局函數(shù)的字符串名。它也可以是一個(gè)數(shù)組名指向一個(gè)類的方法。其他任何的參數(shù),將傳遞到renderDynamic()方法中?;卣{(diào)將返回動(dòng)態(tài)內(nèi)容而不是僅僅顯示它。

希望本文所述對大家基于Yii框架的PHP程序設(shè)計(jì)有所幫助。

更多YII Framework框架教程之緩存用法詳解相關(guān)文章請關(guān)注PHP中文網(wǎng)!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)