Класс кэширования базы данных
Класс кэширования базы данных позволяет вам кэшировать запросы в виде текстовых файлов для уменьшения нагрузки на базу данных.
Важно
Этот класс инициализируется автоматически драйвером базы данных при включенном кэшировании. НЕ загружайте этот класс вручную.
Важно
Не все функции получения результатов запросов доступны при использовании кэширования. Пожалуйста, внимательно прочтите эту страницу.
Включение кэширования
Кэширование включается в три шага:
- Создайте на сервере каталог, доступный для записи, в котором будут храниться кэшированные файлы.
- Установите путь к папке кэша в файле application/config/database.php.
- Включите функцию кэширования, либо глобально, установив предпочтение в файле application/config/database.php, либо вручную, как описано ниже.
После включения кэширование будет происходить автоматически при каждом загрузке страницы, содержащей запросы к базе данных.
Как работает кэширование?
Система кэширования запросов CodeIgniter работает динамически, когда просматриваются страницы. При включенном кэшировании, при первой загрузке веб-страницы, объект результата запроса сериализуется и сохраняется в текстовом файле на вашем сервере. При последующей загрузке страницы используется кэшированный файл вместо обращения к базе данных. Использование базы данных для страниц, которые были кэшированы, может быть эффективно сведено к нулю.
Кэшироваться могут только запросы типа чтения (SELECT), так как это единственный тип запросов, который возвращает результат. Запросы типа записи (INSERT, UPDATE и т.д.) не будут кэшироваться, так как они не генерируют результат.
Кэшированные файлы НЕ истекают. Все кэшированные запросы остаются кэшированными до тех пор, пока вы их не удалите. Система кэширования позволяет вам очистить кэши, связанные с отдельными страницами, или удалить весь набор кэшированных файлов. Как правило, вам нужно будет использовать описанные ниже функции управления, чтобы удалять кэшированные файлы после определённых событий, таких как добавление новой информации в базу данных.
Повысит ли кэширование производительность вашего сайта?
Получение прироста производительности в результате кэширования зависит от многих факторов. Если у вас есть высокооптимизированная база данных с небольшой нагрузкой, вы, вероятно, не заметите повышения производительности. Если ваша база данных загружена, вы, вероятно, увидите улучшенную реакцию, предполагая, что ваша файловая система не перегружена. Помните, что кэширование просто меняет способ извлечения информации, перемещая его из базы данных в файловую систему.
В некоторых кластеризованных серверных средах, к примеру, кэширование может быть вредным, поскольку операции с файловой системой очень интенсивны. На одиночных серверах в средах совместного использования кэширование, вероятно, будет полезным. К сожалению, нет однозначного ответа на вопрос о том, следует ли кэшировать базу данных. Все действительно зависит от вашей ситуации.
Как хранятся кэшированные файлы?
CodeIgniter помещает результат каждого запроса в свой собственный кэшированный файл. Наборы кэшированных файлов далее организуются в подпапки, соответствующие функциям вашего контроллера. Точнее, подпапки имеют имена, идентичные двум первым сегментам вашего URI (имя класса контроллера и имя функции).
Например, предположим, что у вас есть контроллер под названием blog с функцией comments, содержащей три запроса. Система кэширования создаст папку blog+comments, в которую запишет три кэшированных файла.
Если вы используете динамические запросы, которые изменяются на основе информации в вашем URI (например, при использовании пагинации), каждый экземпляр запроса будет генерировать свой собственный кэшированный файл. Таким образом, возможно получить многократно больше кэшированных файлов, чем запросов.
Управление кэшированными файлами
Поскольку кэшированные файлы не истекают, вам нужно будет включить в ваше приложение процедуры удаления. Например, предположим, что у вас есть блог, который позволяет оставлять комментарии. Всякий раз, когда новый комментарий отправляется, вы хотите удалить кэшированные файлы, связанные с функцией контроллера, которая обрабатывает ваши комментарии. Ниже описаны две функции удаления, которые помогут вам очистить данные.
Не все функции базы данных работают с кэшированием
Наконец, мы должны отметить, что объект результата, который кэшируется, представляет собой упрощенную версию полного объекта результата. По этой причине некоторые функции результатов запросов недоступны для использования.
Следующие функции НЕ доступны при использовании кэшированного объекта результата:
- num_fields()
- field_names()
- field_data()
- free_result()
Также два ресурса базы данных (result_id и conn_id) недоступны при кэшировании, так как ресурсы результата относятся только к операциям во время выполнения.
Справочник по функциям
$this->db->cache_on() / $this->db->cache_off()
Вручную включает/выключает кэширование. Это может быть полезно, если вы хотите предотвратить кэширование определённых запросов. Пример:
// Turn caching on
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM mytable");
// Turn caching off for this one query
$this->db->cache_off();
$query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");
// Turn caching back on
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM another_table");
$this->db->cache_delete()
Удаляет кэшированные файлы, связанные с конкретной страницей. Это полезно, если вам нужно очистить кэширование после обновления базы данных.
Система кэширования сохраняет кэшированные файлы в папки, соответствующие URI страницы, которую вы просматриваете. Например, если вы просматриваете страницу example.com/index.php/blog/comments, система кэширования разместит все связанные с ней кэшированные файлы в папке blog+comments. Для удаления этих конкретных кэшированных файлов вы используете:
$this->db->cache_delete('blog', 'comments');
Если вы не используете никаких параметров, при определении того, что должно быть очищено, будет использован текущий URI.
$this->db->cache_delete_all()
Очищает все существующие кэшированные файлы. Пример:
$this->db->cache_delete_all();
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/userguide3/database/caching.html