Получите помощь, поддержку и профессиональное общение в Клубе CodeIgniter

# CodeIgniter User Guide Version 2.1.0

Search User Guide

# Класс кеширования БД (Database Caching)

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

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

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

Для включения кеширования нужно выполнить три шага:

- Создать директорию с правами для записи на вашем сервере, куда будут сохраняться файлы кешей;
- Установить путь к вашему кешу в файле application/config/database.php;
- Включить опцию кеширования, как глобально, установкой параметра в вашем файле application/config/database.php, так и вручную, как описано ниже.

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

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

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

Только читающие (SELECT) запросы могут быть кешированы, так как запросы только этих типов могут производить результат. Пишущие (INSERT, UPDATE и т.д.) запросы, так как они не генерируют результат, не могут быть кешированы системой.

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

## Кеширование увеличивает производительность сайта?

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

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

## Как хранятся файлы кешей?

CodeIgntier помещает результат каждого запроса в собственный файл кеша. Набор файлов кешей организуется в поддиректориях, в соответствии с функциями вашего контроллера. Для точности имена поддиректорий идентичны первым двум сегментам URI (класс контроллера и имя функции).

Например, давайте предположим, что ваш контроллер называется blog, с вызываемой функцией comments, которая содержит три запроса. Кеширующая система создаст директорию кеша с именем `blog+comments`, в которую запишет три файла.

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

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

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

## Не все функции БД поддерживают кеширование

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

Следующие функции `не доступны` при кешировании результата:

- num_fields()
- field_names()
- field_data()
- free_result()

А также, два ресурса БД (result_id и conn_id) не доступны при кешировании, так как эти ресурсы имеют значение только при операциях времени выполнения (run-time operations).

# Справка по функциям

## $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 запрашиваемой страницы. Например, если вы просматриваете страницу 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();`

### Поделиться

Переведено в компании Аринт.

# Спасибо!

Вы тоже можете оказать помощь проекту! Как это сделать?

## Помощь и поддержка

Вы можете задать вопросы и получить ответы и советы от гуру CodeIgniter и веб-разработки: вступайте в Клуб CodeIgniter