mirror of
https://github.com/yiisoft/yii.git
synced 2026-03-04 23:34:05 +01:00
121 lines
7.7 KiB
Plaintext
121 lines
7.7 KiB
Plaintext
Кэширование данных
|
||
==================
|
||
|
||
Кэширование данных — это хранение некоторой переменной PHP в кэше и получение
|
||
её оттуда. Для этой цели базовый класс [CCache] компонента кэша
|
||
имеет два наиболее используемых метода: [set()|CCache::set]
|
||
и [get()|CCache::get].
|
||
|
||
Для кэширования переменной `$value` мы выбираем уникальный идентификатор (ID)
|
||
и вызываем метод [set()|CCache::set] для её сохранения в кэше:
|
||
|
||
~~~
|
||
[php]
|
||
Yii::app()->cache->set($id, $value);
|
||
~~~
|
||
|
||
Данные будут оставаться в кэше до тех пор, пока не будут удалены
|
||
из-за некоторых условий функционирования кэша (например, места для кэширования
|
||
не осталось, тогда более старые данные удаляются). Для изменения такого
|
||
поведения мы можем установить значения срока действия кэша при вызове
|
||
метода [set()|CCache::set]. Тогда данные будут удалены из кэша после
|
||
определенного периода времени:
|
||
|
||
~~~
|
||
[php]
|
||
// храним значение переменной в кэше не более 30 секунд
|
||
Yii::app()->cache->set($id, $value, 30);
|
||
~~~
|
||
|
||
Позже, когда нам понадобится доступ к этой переменной (в этом же или другом
|
||
запросе), мы вызываем метод [get()|CCache::get] с идентификатором переменной.
|
||
Если возвращенное значение — false, то переменная
|
||
не доступна в кэше и мы должны регенерировать ее (обновить в кэше).
|
||
|
||
~~~
|
||
[php]
|
||
$value=Yii::app()->cache->get($id);
|
||
if($value===false)
|
||
{
|
||
// обновляем $value, т.к. переменная не найдена в кэше,
|
||
// и сохраняем в кэш для дальнейшего использования:
|
||
// Yii::app()->cache->set($id,$value);
|
||
}
|
||
~~~
|
||
|
||
При выборе идентификатора для кэшируемой переменной, учитывайте, что он
|
||
должен быть уникальным для каждой переменной из тех, что могут быть
|
||
кэшированы в приложении. *НЕ* требуется, чтобы идентификатор был уникальным
|
||
между разными приложениями, потому что компонент кэша достаточно умен для
|
||
различения идентификаторов разных приложений.
|
||
|
||
Некоторые кэш-хранилища, такие как MemCache, APC, поддерживают загрузку
|
||
нескольких кэшированных значений в пакетном режиме, которая может уменьшить
|
||
накладные расходы на получение данных, сохраненных в кэше. Начиная с версии
|
||
1.0.8, новый метод [mget()|CCache::mget] позволяет использовать эту
|
||
особенность. В случае, когда кэш-хранилище не поддерживает эту функцию,
|
||
[mget()|CCache::mget] будет по-прежнему имитировать ее.
|
||
|
||
Для удаления кэшированного значения из кэша надо вызвать метод
|
||
[delete()|CCache::delete], а для очистки всего кэша — вызвать метод
|
||
[flush()|CCache::flush]. Надо быть осторожным при вызове метода
|
||
[flush()|CCache::flush], т.к. он также удаляет кэшированные данные
|
||
других приложений.
|
||
|
||
> Tip|Подсказка: класс [CCache] реализует `ArrayAccess`, поэтому
|
||
> компонент кэша может использоваться как массив. Ниже приведены примеры:
|
||
> ~~~
|
||
> [php]
|
||
> $cache=Yii::app()->cache;
|
||
> $cache['var1']=$value1; // эквивалентно $cache->set('var1',$value1);
|
||
> $value2=$cache['var2']; // эквивалентно $value2=$cache->get('var2');
|
||
> ~~~
|
||
|
||
Зависимость кэша
|
||
----------------
|
||
|
||
Помимо установки срока действия, кэшируемые данные также могут стать
|
||
недействительными в соответствии с некоторыми изменениями зависимости
|
||
(dependency).
|
||
Например, если мы кэшируем содержимое некоторого файла, и файл изменился,
|
||
мы должны принять кэшированную копию как недействительную и считать свежее
|
||
содержимое из файла, а не из кэша.
|
||
|
||
Мы представляем зависимость как экземпляр класса [CCacheDependency] или
|
||
классов, его наследующих. Мы передаем экземпляр зависимости вместе с
|
||
кэшируемыми данными, когда вызываем метод [set()|CCache::set].
|
||
|
||
~~~
|
||
[php]
|
||
// значение действительно не более 30 секунд
|
||
// также, значение может стать недействительным раньше, если зависимый файл изменен
|
||
Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency('FileName'));
|
||
~~~
|
||
|
||
Теперь, если мы попытаемся получить значение `$value` из кэша, вызвав метод
|
||
[get()|CCache::get], зависимость будет проверена и, если она изменилась, мы
|
||
получим значение false, показывающее, что данные требуют обновления.
|
||
|
||
Ниже приведен список доступных зависимостей кэша:
|
||
|
||
- [CFileCacheDependency]: зависимость меняется, если время модификации файла
|
||
изменено;
|
||
|
||
- [CDirectoryCacheDependency]: зависимость меняется, если любой файл в
|
||
каталоге или в подкаталогах изменен;
|
||
|
||
- [CDbCacheDependency]: зависимость меняется, если результат запроса
|
||
некоторого определенного SQL выражения изменен;
|
||
|
||
- [CGlobalStateCacheDependency]: зависимость меняется, если значение
|
||
определенного глобального состояния изменено. Глобальное состояние —
|
||
это переменная, являющаяся постоянной в многократных запросах и сессиях
|
||
приложения. Устанавливается методом [CApplication::setGlobalState()];
|
||
|
||
- [CChainedCacheDependency]: зависимость меняется, если любая зависимость
|
||
цепочки изменена;
|
||
|
||
- [CExpressionDependency]: зависимость меняется, если результат
|
||
определенного выражения PHP изменен. Данный класс доступен с версии 1.0.4.
|
||
|
||
<div class="revision">$Id: caching.data.txt 1855 2010-03-04 22:42:32Z qiang.xue $</div> |