Spec-Zone.ru › Yii 1.1

COutputCache

Пакет system.web.widgets
Наследование class COutputCache » CFilterWidget » CWidget » CBaseController » CComponent
Реализует IFilter
С момента 1.0
Исходный код framework/web/widgets/COutputCache.php
COutputCache позволяет кешировать вывод, генерируемый действием или фрагментом представления.

Если выводимый вывод найден в кеше, будет отображена кэшированная версия, что экономит время на генерацию исходного вывода.

Поскольку COutputCache расширяет CFilterWidget, он может использоваться как фильтр (для кэширования действий) или как виджет (для кэширования фрагментов). В последнем случае часто используются сокращения CBaseController::beginCache() и CBaseController::endCache(), как показано в файле представления:
if($this->beginCache('cacheName',array('property1'=>'value1',...))
{
    // ... display the content to be cached here
   $this->endCache();
}


COutputCache должен работать с компонентом приложения кеширования, указанным через cacheID. Если компонент приложения кеширования недоступен, COutputCache будет отключен.

Действительность кэшированного содержимого определяется двумя факторами: duration и dependency. Первый определяет количество секунд, в течение которых данные могут оставаться действительными в кеше (по умолчанию 60 секунд), а второй определяет условия, от которых зависят кэшированные данные. Если зависимость изменяется (например, обновляются соответствующие данные в базе данных), кэшированные данные будут недействительными. Более подробную информацию о зависимости кеша см. в CCacheDependency.

Иногда необходимо отключить кэширование вывода только для определённых типов запросов. Например, мы хотим кэшировать форму только при её первоначальном запросе; любое последующее отображение формы не должно кэшироваться, так как она содержит данные пользователя. Для этого можно установить requestTypes в array('GET').

Содержимое, полученное из кеша, может изменяться относительно некоторых параметров. COutputCache поддерживает четыре вида изменений:
  • varyByRoute: это указывает, следует ли изменять кэшированное содержимое в зависимости от запрошенного маршрута (контроллера и действия)
  • varyByParam: это указывает список имён параметров GET и использует соответствующие значения для определения версии кэшированного содержимого.
  • varyBySession: это указывает, следует ли изменять кэшированное содержимое в зависимости от сеанса пользователя.
  • varyByExpression: это указывает, следует ли изменять кэшированное содержимое в зависимости от результата указанного PHP выражения.
  • varyByLanguage: это указывает, следует ли изменять кэшированное содержимое в зависимости от языка пользователя. Доступно начиная с 1.1.14.
Для более сложных изменений переопределите метод getBaseCacheKey().

Общедоступные свойства

Свойство Тип Описание Определено
actionPrefix string Префикс к ID действий. CWidget
cacheID string ID компонента приложения кеширования. COutputCache
controller CController Возвращает контроллер, к которому принадлежит этот виджет. CWidget
dependency mixed Зависимость кэшированного содержимого. COutputCache
duration integer Количество секунд, в течение которых данные могут храниться в кеше. COutputCache
id string Возвращает ID виджета или генерирует новый, если это необходимо. CWidget
isContentCached boolean Является ли содержимое найденным в кэше. COutputCache
isFilter boolean Является ли этот виджет фильтром. CFilterWidget
owner CBaseController Возвращает владельца/создателя этого виджета. CWidget
requestTypes array Список типов запросов (например, GET, POST), для которых кеширование должно быть включено только. COutputCache
skin mixed Имя используемой темы. CWidget
stopAction boolean Прекратить выполнение действия, если этот виджет используется как фильтр. CFilterWidget
varyByExpression string PHP выражение, результат которого используется при расчёте ключа кеша. COutputCache
varyByLanguage boolean Различать кэшированное содержимое в зависимости от языка пользователя. COutputCache
varyByParam array Список параметров GET, которые должны участвовать в расчёте ключа кеша. COutputCache
varyByRoute boolean Различать кэшированное содержимое в зависимости от маршрута. COutputCache
varyBySession boolean Различать кэшированное содержимое в зависимости от сеанса пользователя. COutputCache
viewPath string Возвращает директорию, содержащую файлы представления для этого виджета. CWidget

Защищённые свойства

Свойство Тип Описание Определено
baseCacheKey string Рассчитывает базовый ключ кеша. COutputCache
cache ICache Используемый кеш для кэширования содержимого. COutputCache
cacheKey string Рассчитывает ключ кеша. COutputCache

Открытые методы

Метод Описание Определено в
__call() Вызывает именованный метод, который не является методом класса. CComponent
__construct() Конструктор. CFilterWidget
__get() Возвращает значение свойства, список обработчиков событий или поведение на основе его имени. CComponent
__isset() Проверяет, является ли значение свойства null. CComponent
__set() Устанавливает значение свойства компонента. CComponent
__unset() Устанавливает свойство компонента в null. CComponent
actions() Возвращает список действий, используемых этим виджетом. CWidget
asa() Возвращает объект поведения с указанным именем. CComponent
attachBehavior() Присоединяет поведение к этому компоненту. CComponent
attachBehaviors() Присоединяет список поведений к компоненту. CComponent
attachEventHandler() Присоединяет обработчик событий к событию. CComponent
beginCache() Начинает кеширование фрагмента. CBaseController
beginClip() Начинает запись клипа. CBaseController
beginContent() Начинает рендеринг содержимого, которое должно быть оформлено указанным представлением. CBaseController
beginWidget() Создаёт виджет и выполняет его. CBaseController
canGetProperty() Определяет, можно ли прочитать свойство. CComponent
canSetProperty() Определяет, можно ли установить свойство. CComponent
createWidget() Создаёт виджет и инициализирует его. CBaseController
detachBehavior() Отсоединяет поведение от компонента. CComponent
detachBehaviors() Отсоединяет все поведения от компонента. CComponent
detachEventHandler() Отсоединяет существующий обработчик событий. CComponent
disableBehavior() Отключает присоединённое поведение. CComponent
disableBehaviors() Отключает все присоединённые к этому компоненту поведения. CComponent
enableBehavior() Включает присоединённое поведение. CComponent
enableBehaviors() Включает все присоединённые к этому компоненту поведения. CComponent
endCache() Завершает кеширование фрагмента. CBaseController
endClip() Завершает запись клипа. CBaseController
endContent() Завершает рендеринг содержимого. CBaseController
endWidget() Завершает выполнение указанного виджета. CBaseController
evaluateExpression() Вычисляет выражение PHP или обратный вызов в контексте этого компонента. CComponent
filter() Выполняет фильтрацию перед выполнением действия. COutputCache
getController() Возвращает контроллер, к которому принадлежит этот виджет. CWidget
getEventHandlers() Возвращает список присоединённых обработчиков событий для события. CComponent
getId() Возвращает ID виджета или генерирует новый, если запрошено. CWidget
getIsContentCached() Проверяет, можно ли найти содержимое в кэше COutputCache
getIsFilter() Проверяет, используется ли этот виджет как фильтр. CFilterWidget
getOwner() Возвращает владельца/создателя этого виджета. CWidget
getViewFile() Ищет файл скрипта представления в соответствии с именем представления. CWidget
getViewPath() Возвращает каталог, содержащий файлы представлений для этого виджета. CWidget
hasEvent() Определяет, определено ли событие. CComponent
hasEventHandler() Проверяет, имеет ли указанное событие присоединённые обработчики. CComponent
hasProperty() Определяет, определено ли свойство. CComponent
init() Отмечает начало содержимого, подлежащего кешированию. COutputCache
raiseEvent() Вызывает событие. CComponent
recordAction() Записывает вызов метода, когда этот кэш вывода активен. COutputCache
render() Рендерит представление. CWidget
renderFile() Рендерит файл представления. CBaseController
renderInternal() Рендерит файл представления. CBaseController
run() Отмечает конец содержимого, подлежащего кешированию. COutputCache
setId() Устанавливает ID виджета. CWidget
widget() Создаёт виджет и выполняет его. CBaseController

Защищённые методы

Метод Описание Определено в
checkContentCache() Ищет содержимое в кэше. COutputCache
getBaseCacheKey() Вычисляет базовый ключ кэша. COutputCache
getCache() Возвращает кэш, используемый для кеширования содержимого. COutputCache
getCacheKey() Вычисляет ключ кэша. COutputCache
replayActions() Повторяет записанные вызовы методов. COutputCache

Подробное описание свойств

baseCacheKey свойство только для чтения

protected string getBaseCacheKey()

Вычисляет базовый ключ кэша. Вычисленный ключ будет далее изменён в getCacheKey. Производные классы могут переопределить этот метод, если необходимы дополнительные изменения.

cache свойство только для чтения

protected ICache getCache()

кэш, используемый для кеширования содержимого.

cacheID свойство

public string $cacheID;

Идентификатор компонента приложения кэша. По умолчанию равен 'cache' (основной компонент приложения кэша).

cacheKey свойство только для чтения

protected string getCacheKey()

Вычисляет ключ кэша. Ключ вычисляется на основе getBaseCacheKey и других факторов, включая varyByRoute, varyByParam, varyBySession и varyByLanguage.

dependency свойство

public mixed $dependency;

зависимость, от которой зависит кэшируемое содержимое. Это может быть объект, реализующий интерфейс ICacheDependency, или массив, определяющий конфигурацию объекта зависимости. Например,

array(
    'class'=>'CDbCacheDependency',
    'sql'=>'SELECT MAX(lastModified) FROM Post',
)
сделает кэш вывода зависимым от последнего времени изменения всех постов. Если время изменения любого поста изменится, кэшируемое содержимое будет аннулировано.

duration свойство

public integer $duration;

количество секунд, в течение которых данные могут храниться в кэше. По умолчанию 60 секунд. Если значение равно 0, существующее кэшированное содержимое будет удалено из кэша. Если значение отрицательное, кэш будет отключён (любое существующее кэшированное содержимое останется в кэше).

Обратите внимание, что если зависимость от кэша изменится или место в кэше ограничено, данные могут быть удалены из кэша раньше.

isContentCached свойство только для чтения

public boolean getIsContentCached()

указывает, может ли содержимое быть найдено в кэше

requestTypes свойство

public array $requestTypes;

список типов запросов (например, GET, POST), для которых кэш должен быть включён. По умолчанию null, что означает все типы запросов.

varyByExpression свойство

public string $varyByExpression;

PHP выражение, результат которого используется в вычислении ключа кэша. Установив это свойство, кэш вывода будет использовать разные данные кэша для каждого результата выражения. Выражение также может быть допустимым PHP обратным вызовом, включая имя метода класса (array(ClassName/Object, MethodName)) или анонимную функцию (PHP 5.3.0+). Подпись функции/метода должна быть следующей:

function foo($cache) { ... }
где $cache относится к компоненту кэша вывода.

PHP выражение будет вычислено с помощью evaluateExpression.

PHP выражение может быть любым PHP кодом, имеющим значение. Чтобы узнать больше о том, что такое выражение, обратитесь к руководству PHP.

varyByLanguage свойство (доступно начиная с версии v1.1.14)

public boolean $varyByLanguage;

указывает, следует ли различать кэшируемое содержимое в соответствии с языком пользователя. Язык извлекается через Yii::app()->language. По умолчанию false.

varyByParam свойство

public array $varyByParam;

список параметров GET, которые должны участвовать в вычислении ключа кэша. Установив это свойство, кэш вывода будет использовать разные данные кэша для каждого набора значений параметров GET.

varyByRoute свойство

public boolean $varyByRoute;

указывает, следует ли различать кэшируемое содержимое в соответствии с маршрутом. Маршрут состоит из идентификатора запрошенного контроллера и идентификатора действия. По умолчанию true.

varyBySession свойство

public boolean $varyBySession;

указывает, следует ли различать кэшируемое содержимое в соответствии с сеансами пользователей. По умолчанию false.

Подробное описание методов

checkContentCache() метод

protected boolean checkContentCache()
{return} boolean указывает, найдено ли содержимое в кэше.
Исходный код: framework/web/widgets/COutputCache.php#233 (показать)
protected function checkContentCache()
{
    if((empty(
$this->requestTypes) || in_array(Yii::app()->getRequest()->getRequestType(),$this->requestTypes))
        && (
$this->_cache=$this->getCache())!==null)
    {
        if(
$this->duration>0 && ($data=$this->_cache->get($this->getCacheKey()))!==false)
        {
            
$this->_content=$data[0];
            
$this->_actions=$data[1];
            return 
true;
        }
        if(
$this->duration==0)
            
$this->_cache->delete($this->getCacheKey());
        if(
$this->duration<=0)
            
$this->_cache=null;
    }
    return 
false;
}

Ищет содержимое в кэше.

filter() метод

public boolean filter(CFilterChain $filterChain)
$filterChain CFilterChain список фильтров, применяемых к действию
{return} boolean указывает, следует ли останавливать процесс фильтрации после этого фильтра. По умолчанию false.
Исходный код: framework/web/widgets/COutputCache.php#162 (показать)
public function filter($filterChain)
{
    if(!
$this->getIsContentCached())
        
$filterChain->run();
    
$this->run();
}

Выполняет фильтрацию перед выполнением действия. Этот метод предназначен для переопределения дочерними классами, если требуется начальная фильтрация.

getBaseCacheKey() метод

protected string getBaseCacheKey()
{return} string базовый ключ кэша без изменений
Исходный код: framework/web/widgets/COutputCache.php#266 (показать)
protected function getBaseCacheKey()
{
    return 
self::CACHE_KEY_PREFIX.$this->getId().'.';
}

Вычисляет базовый ключ кэша. Вычисленный ключ будет далее изменён в getCacheKey. Производные классы могут переопределить этот метод, если необходимы дополнительные изменения.

getCache() метод

protected ICache getCache()
{return} ICache кэш, используемый для кеширования содержимого.
Исходный код: framework/web/widgets/COutputCache.php#255 (показать)
protected function getCache()
{
    return 
Yii::app()->getComponent($this->cacheID);
}

getCacheKey() метод

protected string getCacheKey()
{return} string ключ кэша
Исходный код: framework/web/widgets/COutputCache.php#277 (показать)
protected function getCacheKey()
{
    if(
$this->_key!==null)
        return 
$this->_key;
    else
    {
        
$key=$this->getBaseCacheKey().'.';
        if(
$this->varyByRoute)
        {
            
$controller=$this->getController();
            
$key.=$controller->getUniqueId().'/';
            if((
$action=$controller->getAction())!==null)
                
$key.=$action->getId();
        }
        
$key.='.';

        if(
$this->varyBySession)
            
$key.=Yii::app()->getSession()->getSessionID();
        
$key.='.';

        if(
is_array($this->varyByParam) && isset($this->varyByParam[0]))
        {
            
$params=array();
            foreach(
$this->varyByParam as $name)
            {
                if(isset(
$_GET[$name]))
                    
$params[$name]=$_GET[$name];
                else
                    
$params[$name]='';
            }
            
$key.=serialize($params);
        }
        
$key.='.';

        if(
$this->varyByExpression!==null)
            
$key.=$this->evaluateExpression($this->varyByExpression);
        
$key.='.';

        if(
$this->varyByLanguage)
            
$key.=Yii::app()->language;
        
$key.='.';

        return 
$this->_key=$key;
    }
}

Вычисляет ключ кэша. Ключ вычисляется на основе getBaseCacheKey и других факторов, включая varyByRoute, varyByParam, varyBySession и varyByLanguage.

getIsContentCached() метод

public boolean getIsContentCached()
{return} boolean указывает, может ли содержимое быть найдено в кэше
Исходный код: framework/web/widgets/COutputCache.php#221 (показать)
public function getIsContentCached()
{
    if(
$this->_contentCached!==null)
        return 
$this->_contentCached;
    else
        return 
$this->_contentCached=$this->checkContentCache();
}

init() метод

public void init()
Исходный код: framework/web/widgets/COutputCache.php#175 (показать)
public function init()
{
    if(
$this->getIsContentCached())
        
$this->replayActions();
    elseif(
$this->_cache!==null)
    {
        
$this->getController()->getCachingStack()->push($this);
        
ob_start();
        
ob_implicit_flush(false);
    }
}

Отмечает начало содержимого, подлежащего кешированию. Содержимое, отображаемое после вызова этого метода и до endCache(), будет захвачено и сохранено в кэше. Этот метод ничего не делает, если действительное содержимое уже найдено в кэше.

recordAction() метод

public void recordAction(string $context, string $method, array $params)
$context string имя свойства контроллера. Свойство должно ссылаться на объект, метод которого записывается. Если пусто, означает сам контроллер.
$method string имя метода
$params array параметры, передаваемые методу
Исходный код: framework/web/widgets/COutputCache.php#332 (показать)
public function recordAction($context,$method,$params)
{
    
$this->_actions[]=array($context,$method,$params);
}

Записывает вызов метода, когда этот кэш вывода активен. Когда содержимое подаётся из кэша вывода, записанный метод будет повторно вызван.

replayActions() метод

protected void replayActions()
Исходный код: framework/web/widgets/COutputCache.php#340 (показать)
protected function replayActions()
{
    if(empty(
$this->_actions))
        return;
    
$controller=$this->getController();
    
$cs=Yii::app()->getClientScript();
    foreach(
$this->_actions as $action)
    {
        if(
$action[0]==='clientScript')
            
$object=$cs;
        elseif(
$action[0]==='')
            
$object=$controller;
        else
            
$object=$controller->{$action[0]};
        if(
method_exists($object,$action[1]))
            
call_user_func_array(array($object,$action[1]),$action[2]);
        elseif(
$action[0]==='' && function_exists($action[1]))
            
call_user_func_array($action[1],$action[2]);
        else
            throw new 
CException(Yii::t('yii','Unable to replay the action "{object}.{method}". The method does not exist.',
                array(
'object'=>$action[0],
                    
'method'=>$action[1])));
    }
}

Повторяет записанные вызовы методов.

run() метод

public void run()
Исходный код: framework/web/widgets/COutputCache.php#193 (показать)
public function run()
{
    if(
$this->getIsContentCached())
    {
        if(
$this->getController()->isCachingStackEmpty())
            echo 
$this->getController()->processDynamicOutput($this->_content);
        else
            echo 
$this->_content;
    }
    elseif(
$this->_cache!==null)
    {
        
$this->_content=ob_get_clean();
        
$this->getController()->getCachingStack()->pop();
        
$data=array($this->_content,$this->_actions);
        if(
is_array($this->dependency))
            
$this->dependency=Yii::createComponent($this->dependency);
        
$this->_cache->set($this->getCacheKey(),$data,$this->duration,$this->dependency);

        if(
$this->getController()->isCachingStackEmpty())
            echo 
$this->getController()->processDynamicOutput($this->_content);
        else
            echo 
$this->_content;
    }
}

Помечает конец контента, который должен быть кэширован. Контент, отображаемый до этого вызова метода и после init(), будет захвачен и сохранён в кэше. Этот метод ничего не делает, если действительный контент уже найден в кэше.

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/COutputCache

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API