Думаю не нужно рассказывать, зачем бывает нужно кеширование. Вопрос в том как его сделать. Материал поста является своеобразным пересказом штатного мануала и человеку знакомому с ним ничего принципиально нового не скажет.
В Codeigniter я знаю два штатных механизма кеширования. Это кеширование выдаваемой страницы и кеширование запроса. Эти кеши не конкурируют друг с другом а скорее взаимодополняют друг друга Кеширование SQL-запросов —————————————————– Для начала нужно в файле application/config/database.php указать папку, в которой будут кешироваться результат выполненных запросов. Естественно, эта папка должна быть доступной для записи.
1
|
$db['default']['cachedir'] = "my_cachedir/";
|
Также нужно включить кеширование установив опцию cache_on,
1
|
$db['default']['cache_on'] = true;
|
или вручную вызвав в контроллере команду $this->db->cache_on()
И всё. Кеширование запросов будет работать. По мере заполнения кеша результат запросов будет браться из кеша.
Для полного понимания работы с кешем запросов нужно понимать следующие моменты:
- Результат запроса в кеше привязан к URI вызывающего контроллера. Т.е. у каждого контроллера и даже у каждой функции будет свой кеш. Даже если разные контроллеры иногда используют одинаковые запросы – кеш одного контроллера не будет использоваться другим.
К этому надо быть готовым
- Кеш не имеет механизма самоочистки и в состоянии покоя будет хранится бесконечно.Для нормальной работы его нужно сбрасывать вручную либо командой $this->db->cache_delete() для очистки кеша текущей функции текущего контроллера, либо $this->db->cache_delete_all() для полного сброса кеша.
- Также нужно понимать, что данные так и остаются на диске. И если база данных построена оптимальным образом, а запросы максимально просты, то выигрыша не будет. Кеширование запросов имеет смысл, когда запросы выполняются долго, или вообще MySQL становится узким местом.
Должен сказать, что у меня большого выигрыша производительности использование такого кеша не дало. Зато появилось спокойствие за ограничения MySQL.
Кеширование страницы ————————————— Если в предыдущем случае кешируется результат запроса, который потом используется при генерации страницы, то здесь кешируется окончательно сгенерированная страница. Кеш хранится в папке system/cache. Естественно ей нужно назначить права на запись. Иначе кеширование не работает, при этом не выдаётся никаких ошибок, а страница открывается как обычно.
Кешировать или не кешировать страницу можно указать в каждой конкретной функции контроллера. Для этого достаточно вызвать функцию
1
|
$this->output->cache(5);
|
где 5 – это количество минут, которое кеш будет жить. Таким образом кеш обновляется самостоятельно. Специально чистить кеш не нужно. Если очень нужно – можно удалить файлы из system/cache.
Этот способ кеширования у меня дал радикальное ускорение страниц, скорость приблизилась к статическим страницам.
Резюме —————————- Я для себя подумал – а ведь ничто не мешает комбинировать оба кеша. Кеш запросов экономит запросы к серверу в моменты, когда БД не модифицируется, а кеш страниц кратковременно кеширует всю страницу в моменты множества запросов к одним и тем же страницам
За двумя зайцами погонишься – обоих поймать можно.
|