Повышение производительности при помощи кэширования фреймворка Yii

Yii (аббревиатура от Yes It Is) – это фреймворк PHP с высокой производительностью, основанный на архитектуре MVC. Среди многих полезных функций этого фреймворка особое внимание следует уделить системе управления кэшем.

Yii позволяет сохранять статические данные и запросы SQL/Active Record, что при мудром подходе может значительно увеличить скорость загрузки страницы.

Данное руководство посвящено кэшированию данных и запросов.

Включение компонента кэширования

Для начала нужно включить компонент кэширования. Для этого просто откройте конфигурационный файл, перейдите в массив components и внесите в него следующий код:

'cache'=>array(
'class'=>'system.caching.CDbCache'
)

Как видите, данный код задает использование CDbCache – одного из многих компонентов кэширования, доступных в Yii. Данный компонент хранит кэшированные данные в базе данных SQLite, что очень упрощает его настройку. Возможно, это далеко не лучший выбор с точки зрения производительности, но этот компонент все же сделает веб-приложение немного быстрее.

Другой доступный (и, к слову, более мощный) вариант – компонент CApcCache, который использует встроенный в систему кэширования инструмент APC (Alternative PHP Cache), который поставляется с новейшими версиями PHP.

Все компоненты кэширования основаны на классе CCache, что позволяет легко переключаться с одного компонента на другой, просто меняя имя компонента (например, system.caching.CApcCache) без необходимости вносить изменения в код прложения.

Простое кэширование данных

Самый простой и распространенный способ использования кэширования – хранение переменных. Для этого в компонентах кэширования Yii есть две функции: get() и set().

Итак, для начала задайте значение, которое нужно кэшировать. Для этого необходимо присвоить ему уникальный идентификатор, например:

// Storing $value in Cache
$value = "This is a variable that I am storing";
$id    = "myValue";
$time  = 30; // in seconds
Yii::app()->cache->set($id, $value, $time);

Последнее значение, $time, не является необходимым, но оно позволяет предотвратить вечное хранение уже ненужного или устаревшего значения.

Чтобы получить значение, сохраненное в кэше, просто введите:

Yii::app()->cache->get($id);

Если значение недоступно в кэше (например, его не существует или срок его хранения истек), функция вернет значение false.

Можно легко проверить, сохранено ли то или иное значение в кэше:

$val = Yii::app()->cache->get($id);
if (!$val):
// the value is not cached, do something here
else:
// the value is cached, do something else here
endif;

Удаление кэшированных данных

Чтобы удалить данные из кэша, вызовите:

Yii::app()->cache->delete($id);

Чтобы полностью очистить кэш данных, введите:

Yii::app()->cache->flush();

Кэширование запросов

Эта разработанная на основе системы кэширования данных функция особенно полезна для повышения производительности больших приложений, работа которых зависит от БД.

Для начала нужно определить зависимости (dependency). Другими словами, на данном этапе нужно определить более легкий запрос к БД, который будет вызываться перед требуемым запросом. Это делается для того, чтобы иметь возможность проверить, появились ли в базе данных какие-либо изменения. Если это так, то запрос будет вызван не из кэша, а из БД.

К примеру, нужно извлечь из кэша список авторов (Authors); тогда экземпляр зависимости будет иметь такой вид:

SELECT MAX(id) FROM authors

Эта зависимость проверяет, появились ли в списке новые авторы. Если нет, то компонент кэширования выведет сохраненный в кэше экземпляр списка, не отправляя достаточно объемный запрос базе данных, который выглядит примерно так:

SELECT authors.*, book.title
FROM authors
JOIN book ON book.id = authors.book_id

Конструктор запросов Yii

Чтобы использовать конструктор запросов для кэширования запросов Yii, нужно написать следующее (возвращаясь к предыдущему примеру о списке авторов):

// big query
$query = ' SELECT authors.*, book.title
FROM authors
JOIN book ON book.id = authors.book_id';
// dependency query
$dependency = new CDbCacheDependency('SELECT MAX(id) FROM authors');
// executing query using Yii Query Builder
$result = Yii::app()->db->cache(1000, $dependency)->createCommand($query)->queryAll();

Аргументы, переданные Yii::app()->db->cache() – количество секунд, в течение которого будет храниться результат, и зависимость соответственно.

Как говорилось ранее, при запуске этого кода Yii будет сначала проверять результаты зависимости. В случае если фреймворк обнаружит изменения в БД, он будет обрабатывать большой запрос, чтобы извлечь нужную информацию и сохранить ее в кэше. В противном случае он просто извлечет нужные данные из кэша.

Кэширование запросов с ActiveRecord

Можно также кэшировать результаты запросов совместно с Active Record. Подход остается таким же, но синтаксис немного меняется:

$dependency = new CDbCacheDependency('SELECT MAX(id) FROM authors');

Примечания

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

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

Tags: , , , , , , , , , ,

Добавить комментарий