COutputCache
| Пакет | system.web.widgets |
|---|---|
| Наследование | class COutputCache » CFilterWidget » CWidget » CBaseController » CComponent |
| Реализует | IFilter |
| С момента | 1.0 |
| Исходный код | framework/web/widgets/COutputCache.php |
Если выводимый вывод найден в кеше, будет отображена кэшированная версия, что экономит время на генерацию исходного вывода.
Поскольку 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.
Общедоступные свойства
| Свойство | Тип | Описание | Определено |
|---|---|---|---|
| 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 | указывает, найдено ли содержимое в кэше. |
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. |
public function filter($filterChain)
{
if(!$this->getIsContentCached())
$filterChain->run();
$this->run();
}
Выполняет фильтрацию перед выполнением действия. Этот метод предназначен для переопределения дочерними классами, если требуется начальная фильтрация.
getBaseCacheKey() метод
protected string getBaseCacheKey() | ||
| {return} | string | базовый ключ кэша без изменений |
protected function getBaseCacheKey()
{
return self::CACHE_KEY_PREFIX.$this->getId().'.';
}
Вычисляет базовый ключ кэша. Вычисленный ключ будет далее изменён в getCacheKey. Производные классы могут переопределить этот метод, если необходимы дополнительные изменения.
getCache() метод
protected ICache getCache() | ||
| {return} | ICache | кэш, используемый для кеширования содержимого. |
protected function getCache()
{
return Yii::app()->getComponent($this->cacheID);
}
getCacheKey() метод
protected string getCacheKey() | ||
| {return} | string | ключ кэша |
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 | указывает, может ли содержимое быть найдено в кэше |
public function getIsContentCached()
{
if($this->_contentCached!==null)
return $this->_contentCached;
else
return $this->_contentCached=$this->checkContentCache();
}
init() метод
public void init() |
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 | параметры, передаваемые методу |
public function recordAction($context,$method,$params)
{
$this->_actions[]=array($context,$method,$params);
}
Записывает вызов метода, когда этот кэш вывода активен. Когда содержимое подаётся из кэша вывода, записанный метод будет повторно вызван.
replayActions() метод
protected void replayActions() |
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() |
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