пятница, 19 марта 2010 г.

Кеширование в CodeIgniter

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


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

—————————————————–
Для начала нужно в файле application/config/database.php указать папку, в которой будут кешироваться результат выполненных запросов. Естественно, эта папка должна быть доступной для записи.


1
$db['default']['cachedir'] = "my_cachedir/";

Также нужно включить кеширование установив опцию cache_on,


1
$db['default']['cache_on'] = true;

или вручную вызвав в контроллере команду $this->db->cache_on()
И всё. Кеширование запросов будет работать. По мере заполнения кеша результат запросов будет браться из кеша.
Для полного понимания работы с кешем запросов нужно понимать следующие моменты:

  1. Результат запроса в кеше привязан к URI вызывающего контроллера. Т.е. у каждого контроллера и даже у каждой функции будет свой кеш. Даже если разные контроллеры иногда используют одинаковые запросы – кеш одного контроллера не будет использоваться другим.

    К этому надо быть готовым
  2. Кеш не имеет механизма самоочистки и в состоянии покоя будет хранится бесконечно.Для нормальной работы его нужно сбрасывать вручную либо командой $this->db->cache_delete() для очистки кеша текущей функции текущего контроллера, либо $this->db->cache_delete_all() для полного сброса кеша.
  3. Также нужно понимать, что данные так и остаются на диске. И если база данных построена оптимальным образом, а запросы максимально просты, то выигрыша не будет. Кеширование запросов имеет смысл, когда запросы выполняются долго, или вообще MySQL становится узким местом.
Должен сказать, что у меня большого выигрыша производительности использование такого кеша не дало. Зато появилось спокойствие за ограничения MySQL. :)
Кеширование страницы

—————————————

Если в предыдущем случае кешируется результат запроса, который потом используется при генерации страницы, то здесь кешируется окончательно сгенерированная страница. Кеш хранится в папке system/cache. Естественно ей нужно назначить права на запись. Иначе кеширование не работает, при этом не выдаётся никаких ошибок, а страница открывается как обычно.
Кешировать или не кешировать страницу можно указать в каждой конкретной функции контроллера. Для этого достаточно вызвать функцию


1
$this->output->cache(5);

где 5 – это количество минут, которое кеш будет жить. Таким образом кеш обновляется самостоятельно. Специально чистить кеш не нужно. Если очень нужно – можно удалить файлы из system/cache.
Этот способ кеширования у меня дал радикальное ускорение страниц, скорость приблизилась к статическим страницам.
Резюме

—————————-

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


Посты по теме:

  1. Debug Toolbar для CodeIgniter
  2. ALCAPTCHA = Капча + AJAX + CodeIgniter
  3. Проверка форм в CodeIgniter
  4. CMS-визитка на CodeIgniter
  5. Делаем Sitemap в CodeIgniter


Комментариев нет:

Отправить комментарий