Кэширование для CodeIgniter

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

Мною был выбран механизм кэширования Zend Cache, поясню почему:
Во первых этот механизм позволяет использовать разные фронтэнды и бэкенды через один API.
Во вторых удобное управление кэшем, гибкие настройки.
В третьих просто потому что он является стабильным и надёжным механизмом кэширования, и его разработкой и поддержкой занимаются профессионалы.

Использование компонента Zend Cache в CodeIgniter неудобно, поэтому решил написать свою библиотеку, которя будет использовать этот механизм кэширования и будет проста в применении с CodeIgniter. Теперь немного опишу своё творение, и расскажу как его применить.

Пример применения библиотеки

Для начала нужно сконфигурировать библиотеку, для этого нужно создать файл cache.php в /aplication/config/ примерно так:

//Путь до библиотеки Zend
$config['path_to_zend']  = '';

//Название фронтэнда
$config['frontend'] = 'Core';
//Название бэкэнда
$config['backend']  = 'File';

//Опции фронтэнда
$config['frontendOption']  = array(
       'lifetime'                  => null,
       'automatic_cleaning_factor' => 0,
       'automatic_serialization'    => true
);

//Опции бэкэнда
$config['backendOption']  = array(
    'cache_dir'              => APPPATH.'cache/',
    'read_control_type'      => 'strlen',
    'file_locking'           => false,
    'hashed_directory_level' => 0,
    'file_name_prefix'         => 'cache'
);

Здесь все ключи массива должны называться как и в документации Zend Cache. Все значения в примере данного конфига демонстрационные, вы сами должны подобрать необходимые для себя параметры.
Теперь библиотека настроена и можно перейти к её применению.
Для загрузки используем уже знакомый нами метод:

$this->load->library('Cache');

Пример 1:

if ( ! $end = $this->cache->load('name_ceche') ) {

    $blog = $this->db->get(«blog»);
    $category = $this->db->get(«category»);

    $end['content'] = $blog->result();
    $end['category'] = $category->result();

    $this->cache->save($end, 'name_ceche', array('page1', 'blog'));
}

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

Пример 2:

if ( ! $end = $this->cache->load('name_ceche') ) {

    $blog = $this->db->get(«blog»);

    $data['content'] = $blog->result();

    $end = $this->load->view('myfile', $data, true);
   
    $this->cache->save($end, 'name_ceche', array('page1', 'blog'));
}

Во втором примере мы видим что кэшируется уже не массив с данными а целая часть страницы. Такой метод позволяет кэшировать данные которые не требуют частого обновления (например список категорий на странице, облако тэгов и т.д.) либо генерация этих данных очень ресурсоёмка и имеет смысл сохранить их на небольшой промежуток времени. И в данном случае опцию 'automatic_serialization' не обязательно устанавливать в true;

Пример 3:

$this->cache->remove('name_ceche');
$this->cache->clean('page1');
$this->cache->clean('blog');

В примере №3 показаны способы удаления кэша который мы создали ранее, в примерах 1 и 2. Но заметьте сделать что это можно сделать разными способами.
С помощью первого метода можно удалить кэш по его уникальному имени, с помощью второго и третьего метода мы сделаем тоже самое но используя ни его имя, а тэги которые были присвоены кэшу. Это позволяет удобно управлять кэшем, например можно удалить кэш категорий только с определённой страницы, задав при сохранении определённые тэги.

Запись навигация

Top