Кеширование в 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.

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

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

За двумя зайцами погонишься – обоих поймать можно.