CodeIgniter, руководство пользователя к версии 1.6.1


Класс кэширования базы данных

Класс кэширования базы данных позволяет кэшировать запросы в текстовых файлах для снижения нагрузки на базу данных.

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

Также следует отметить:  При кэшировании возможно использование НЕ всех функций результатов запроса. Пожалуйста, читайте эту страницу внимательнее.

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

Кэширование включается в три шага:

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

Как работает кэширование?

Кэширования запроса CodeIgniter'а происходит динамически при просмотре страниц. Когда кэширование включено, то при первой загрузке страницы объект результата запроса сериализуется и сохраняется в текстовом файле на сервере. При последующей загрузке страницы, вместо подключения к базе данных, загружается кэш-файл. Таким обазом, использование базы данных может быть фактически сниженно до нуля при использовании кешированных страниц.

Кэшироваться могут только запросы на чтение (SELECT) потому, что только запросы этого типа генерируют результат. Запросы на запись (INSERT, UPDATE и т. д.) не могут кэшироваться системой потому, что не генерируют результат.

Срок жизни кэш-файлов неограничен. Любые запросы, будучи закэшированными, остаются кэшированными до тех пор, пока их не удалят. Система кэширования позволяет очищать кэш ассоциированный с определенной страницей или вы можете удалить целую коллекцию кэш-файлов. Обычно используются служебные функции, описанные ниже, для удаления кэш-файлов после наступления определенных событий, таких как, например, добавление информации в базу данных.

Повысит ли кэширование производительность вашего сайта?

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

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

Как хранятся кэш-файлы?

CodeIgniter размещает результаты КАЖДОГО запроса в его собственном кэш-файле. Затем наборы кэш-файлов упорядочиваются в поддиректориях соответствующих функциям контроллера. Точнее, поддиректории именуются в соответвии с первыми двумя сегментами URI (имя класс контроллера и имя функции).

Например, допустим имеется контроллер blog с функцией comments, которая содержит три запроса, тогда система кэширования создаст кэш-директорию с именем blog+comments, в которую она запишет три кэш-файла.

Если используются динамические запросы, которые изменяются в зависимости от информации в URI (например, при использовании пагинации — разбиения на страницы), то в этом случае каждый экземпляр запроса сгенерирует свой собственный кэш-файл. Следовательно, в результате может получится, что кэш-файлов будет больше, чем запросов.

Управление кэш-файлами

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

Не все функции базы данных работают с кэшированием

В заключении, обратим внимание на то, что кэшированный результирующий объект — это упрощенная версия полного результирующего объекта. По этой причине некоторые функции результатов запроса недоступны для использования.

Следующие функции НЕДОСТУПНЫ при использовании кэшированного результирующего объекта:

Также при кэшировании недоступны два ресурса базы данных (result_id и conn_id), поскольку результирующие ресурсы относятся только к операциям, выполняемым в данный момент.


Справочник функций

$this->db->cache_on()  /   $this->db->cache_off()

Ручное включение/отключение кэширования. Эта функция может оказаться полезной, если необходимо оградить какой-то конкретный запрос от кэширования. Пример:

// Включение кэширования
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM mytable");

// Отключение кэширования для этого одного запроса
$this->db->cache_off();
$query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");

// Обратное включение кэширования
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM another_table");

$this->db->cache_delete()

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

Система кэширования сохраняет кэш-файлы в директориях соответвующих URI просмотренных страниц. Например, если вы просматриваете страницу www.your-site.com/index.php/blog/comments, то система кэширования поместит кэш-файлы, ассоциированные с этой страницей, в директорию blog+comments. Для удаления этих кэш-файлов, необходимо использовать:

$this->db->cache_delete('blog', 'comments');

Если не указывать параметры, то при определнии того, что необходимо очистить, будет использоваться текущий URI.

$this->db->cache_delete_all()

Очищает все существующие кэш-файлы. Пример:

$this->db->cache_delete_all();