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

Maison php教程 PHP開(kāi)發(fā) Explication détaillée de l'utilisation du cache dans le didacticiel du framework YII Framework

Explication détaillée de l'utilisation du cache dans le didacticiel du framework YII Framework

Dec 27, 2016 pm 02:04 PM

L'exemple de cet article décrit l'utilisation du cache du framework YII Framework. Partagez-le avec tout le monde pour référence, les détails sont les suivants?:

Les raisons de la mise en cache sont bien connues. Par conséquent, en tant que framework efficace et facile à utiliser, YII ne peut que prendre en charge la mise en cache. Par conséquent, YII fournit des interfaces pour divers caches populaires et vous pouvez utiliser différents caches en fonction de vos besoins.

1. Introduction à la mise en cache dans YII

Le cache dans YII est défini via des composants, notamment dans le répertoire suivant

/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
└── dépendances
├── CCacheDependency.php
├── CChainedCacheDependency.php
├── CDbCacheDependency.php
├── CDirectoryCacheDependency.php
├── CExpression. php
├ ── CFileCacheDependency.php
└── CGlobalStateCacheDependency.php

1 répertoire, 17 fichiers

Le texte original officiel est expliqué comme suit?:

Yii fournit différentes mises en cache Les données du cache peuvent être stockées sur différents supports. Par exemple, le composant CMemCache encapsule l'extension Memcache de PHP et utilise la mémoire comme support de stockage de cache. Le composant CApcCache encapsule l'extension PHP APC ; et le composant CDbCache stocke les données mises en cache dans la base de données. Voici une liste des composants de mise en cache disponibles?:

CMemCache?: utilise l'extension PHP memcache

CApcCache?: utilise l'extension PHP APC

CXCache?: utilise l'extension PHP XCache. . Notez que ceci est pris en charge à partir de la version 1.0.1.

CEAcceleratorCache?: utilisez l'extension PHP EAccelerator.

CDbCache?: utilisez une table de données pour stocker les données du cache. Par défaut, il créera et utilisera une base de données SQLite3 dans le répertoire d'exécution. Vous pouvez également spécifier une base de données à utiliser en définissant sa propriété connectionID.

CZendDataCache?: utilisez Zend Data Cache comme support de mise en cache backend. Notez que ceci est pris en charge à partir de la version 1.0.4.

CFileCache?: utilisez des fichiers pour stocker les données du cache. Ceci est particulièrement utile pour stocker de grandes quantités de données (telles que des pages). Notez que ceci est pris en charge à partir de la version 1.0.6.

CDummyCache?:?actuellement, le cache factice n'implémente pas la fonction de mise en cache. Le but de ce composant est de simplifier le code qui doit vérifier la disponibilité du cache. Par exemple, nous pouvons utiliser ce composant de mise en cache pendant la phase de développement ou lorsque le serveur ne prend pas encore en charge la fonctionnalité de mise en cache réelle. Lorsque la prise en charge réelle de la mise en cache est activée, nous pouvons passer à l'utilisation du composant de mise en cache correspondant. Dans les deux cas, nous pouvons utiliser le même code Yii::app()->cache->get($key) pour obtenir le fragment de données sans craindre que Yii::app()->cache soit nul. Ce composant est supporté depuis la version 1.0.5.

Astuce?: Puisque tous ces composants de mise en cache héritent de la même classe de base CCache, vous pouvez passer à une autre méthode de mise en cache sans modifier le code qui utilise le cache.

La mise en cache peut être utilisée à différents niveaux. Au niveau le plus bas, nous utilisons des caches pour stocker des éléments de données individuels, tels que des variables. Nous appelons cela la mise en cache des données. Au niveau suivant, nous stockons dans le cache un fragment de page généré dans le cadre du script de vue. Et au plus haut niveau, nous stockons la page entière en cache et la récupérons en cas de besoin.

Dans les prochaines sections, nous expliquerons en détail comment utiliser la mise en cache à ces niveaux.

Remarque : Par définition, un cache est un support de stockage instable. Même s'il n'y a pas de délai d'attente, cela ne garantit pas que les données mises en cache doivent exister. Par conséquent, n’utilisez pas le cache comme stockage persistant. (Par exemple, n'utilisez pas le cache pour stocker les données de session).

2. Configuration du cache et méthode d'appel

Le cache dans Yii est principalement implémenté via des composants. La méthode de configuration spécifique peut être configurée via la description de la classe de cache.

Généralement une classe qui spécifie le composant de cache

Par exemple, apc

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

La méthode de configuration de memcache peut être

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

Utilisation :

yii encapsule des méthodes pour différentes opérations de cache, se concentrant principalement sur CCache. CCache est la classe de base de toutes les classes Cache. Par conséquent, après avoir configuré le cache, la méthode d'appel est très simple?:

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

Selon la description de la classe CCache, on peut voir que les méthodes courantes d'opération du cache sont 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();
}

C'est-à-dire :

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

xxx correspond à la méthode spécifique.

Par exemple?:

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

Voici les instructions d'utilisation de plusieurs méthodes de mise en cache officiellement données par Yii. Elles sont insensibles et copiées ici.

3. cache?: Cache de données

Cache de données

Le cache de données stocke certaines variables PHP dans le cache puis les récupère du cache ultérieurement. à cette fin, la classe de base CCache pour la mise en cache des composants fournit les deux méthodes les plus couramment utilisées : set() et get().

Pour stocker une variable $value dans le cache, nous choisissons un identifiant unique et appelons set() pour la stocker?:

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

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

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

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

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

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

一些緩存存儲(chǔ)器,例如 MemCache, APC, 支持以批量模式獲取多個(gè)緩存值。這可以減少獲取緩存數(shù)據(jù)時(shí)帶來(lái)的開(kāi)銷(xiāo)。 從版本 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. 緩存依賴(lài)

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

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

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

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

如下是可用的緩存依賴(lài)的簡(jiǎn)要說(shuō)明:

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

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

片段緩存(Fragment Caching)

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

要使用片段緩存,在控制器視圖腳本中調(diào)用CController::beginCache() 和CController::endCache() 。這兩種方法開(kāi)始和結(jié)束包括的頁(yè)面內(nèi)容將被緩存。類(lè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)容將無(wú)效。

依賴(lài)(Dependency)

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

要指定一個(gè)依賴(lài),我們建立了dependency選項(xiàng),可以是一個(gè)實(shí)現(xiàn)[ICacheDependency]的對(duì)象或可用于生成依賴(lài)對(duì)象的配置數(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)置了這一特征,程序員不需要編寫(xiě)根據(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è)用戶(hù)會(huì)話(huà)可能會(huì)看到由緩存提供的不同內(nèi)容。
varyByParam: 設(shè)置此選項(xiàng)的數(shù)組里的名字,緩存的內(nèi)容將根據(jù)GET參數(shù)的值變動(dòng)。例如,如果一個(gè)頁(yè)面顯示文章的內(nèi)容根據(jù)id的GET參數(shù),我們可以指定varyByParam為array('id'),以使我們能夠緩存每篇文章內(nèi)容。如果沒(mé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í)候,我們希望片段緩存只對(duì)某些類(lèi)型的請(qǐng)求啟用。例如,對(duì)于某張網(wǎng)頁(yè)上顯示表單,我們只想要緩存initially requested表單(通過(guò)GET請(qǐng)求)。任何隨后顯示(通過(guò)POST請(qǐng)求)的表單將不被緩存,因?yàn)楸韱慰赡馨脩?hù)輸入。要做到這一點(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)

片段緩存可以嵌套。就是說(shuō)一個(gè)緩存片段附在一個(gè)更大的片段緩存里。例如,意見(jiàn)緩存在內(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í)間長(zhǎng)短不同的持續(xù)值。當(dāng)數(shù)據(jù)存儲(chǔ)在外部緩存無(wú)效,內(nèi)部緩存仍然可以提供有效的內(nèi)部片段。 然而,反之就不行了。如果外部緩存包含有效的數(shù)據(jù), 它會(huì)永遠(yuǎn)保持緩存副本,即使內(nèi)容中的內(nèi)部緩存已經(jīng)過(guò)期。

5.緩存的使用:頁(yè)面緩存

頁(yè)面緩存

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

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

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

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

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

Tip: 我們可以使用COutputCache作為一個(gè)過(guò)濾器,因?yàn)樗鼜腃FilterWidget繼承過(guò)來(lái), 這意味著它是一個(gè)工具(widget)和一個(gè)過(guò)濾器。事實(shí)上,widget的工作方式和過(guò)濾器非常相似: 工具widget (過(guò)濾器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)的。例如,幫助頁(yè)可能會(huì)顯示靜態(tài)的幫助 信息,而用戶(hù)名稱(chēng)顯示的是當(dāng)前用戶(hù)的。

解決這個(gè)問(wèn)題,我們可以根據(jù)用戶(hù)名匹配緩存內(nèi)容,但是這將是我們寶貴空間一個(gè)巨大的浪費(fèi),因?yàn)榫彺娉擞脩?hù)名其他大部分內(nèi)容是相同的。我們還可以把網(wǎng)頁(yè)切成幾個(gè)片段并分別緩存,但這種情況會(huì)使頁(yè)面和代碼變得非常復(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)容通過(guò)一些方法或函數(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)前控制器類(lèi)的方法或者全局函數(shù)的字符串名。它也可以是一個(gè)數(shù)組名指向一個(gè)類(lèi)的方法。其他任何的參數(shù),將傳遞到renderDynamic()方法中。回調(diào)將返回動(dòng)態(tài)內(nèi)容而不是僅僅顯示它。

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

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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)