CodeIgniterКэширование для CodeIgniter с помощью Zend Cache

Опубликовано 26 января 2009 Комментарии (9)

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

Мною был выбран механизм кэширования 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. Но заметьте сделать что это можно сделать разными способами.
С помощью первого метода можно удалить кэш по его уникальному имени, с помощью второго и третьего метода мы сделаем тоже самое но используя ни его имя, а тэги которые были присвоены кэшу. Это позволяет удобно управлять кэшем, например можно удалить кэш категорий только с определённой страницы, задав при сохранении определённые тэги.

Подробную информацию о том для чего определённые настройки и описание бэкендов и фронтэндов не приводил т.к. эта информация есть на русском языке в документации к Zend Cache.

Скачать

Cache.zip (59Kb)
Cache.tar.gz (31,4Kb)

Метки: PHP, CodeIgniter, Кэширование

Комментарии:

Evgeny 28 январь 2009, 14:50
почему у вас 'lifetime' => null,
и реализован только файловый бэкэнд?
Ответить
Ladygin 28 январь 2009, 16:33
Evgeny
'lifetime' => null — если так то кэш будет храниться вечно пока его не удалите, а если задать число то это будет время обновления кэша.
и реализован только файловый бэкэнд? — нет там можно использовать любой бэкэнд и фронтэнд, но честно говоря пока что кроме файлового другие не тестировал )
Ответить
nik 07 апрель 2009, 07:26
не могу понять как работает — set_settings

$this->load->library('Cache');
$this->cache->set_settings('lifetime', '10');
не срабатывает, значение lifetime берется из /aplication/config/cache.php
Ответить
nik 07 апрель 2009, 08:49
вопрос снят, оказывается не увидел в save «уникальное время жизни кэша для текущих данных»
Ответить
Nick 23 сентябрь 2009, 11:09
Fatal error: Uncaught exception 'Zend_Cache_Exception' with message 'cache_dir must be a directory' in Y:\home\my1.ru\www\Zend\Cache.php:208 Stack trace: #0 Y:\home\my1.ru\www\Zend\Cache\Backend\File.php(153): Zend_Cache::throwException('cache_dir must ...') #1 Y:\home\my1.ru\www\Zend\Cache\Backend\File.php(120): Zend_Cache_Backend_File->setCacheDir('Y:\home\my1.ru\...') #2 Y:\home\my1.ru\www\Zend\Cache.php(152): Zend_Cache_Backend_File->__construct(Array)
Выдает такие ошибки… где косяк интересно?
Ответить
Nick 23 сентябрь 2009, 11:17
вопрос решен, просто документация к сращиванию очень непонятна(( приходиться методом тыка
Ответить
Alex 03 ноябрь 2009, 16:56
Здравствуйте, подскажите пожалуйста может кто сталкивался.
Пишу
if (! $end = $this->cache->load('registration') ) {
$this->load->model('model_user_register');
$this->load->model('model_get_list');
$data['body'] = 'view_register';
$country_list=$this->model_get_list->getCountryList();
$data['country_list']=$country_list;
$end = $this->load->view('view_template_main', $data, true);
$this->cache->save($end, 'registration', array('page1', 'blog'),1000);
}
Кэш в папку ложится (два файла 1 — mycms---internal-metadatas---registration, 2 — mycms---registration), но подгружается пустая страница.
Ответить
Ladygin 10 ноябрь 2009, 00:54
Здравствуйте Alex.
У вас потом данные из переменной $end как то выводятся?
Ответить
shamalli 13 апрель 2010, 03:14
В вашей библиотеке, которая адаптер для игнитера, проверьте метод clean
аргументы не в том порядке, надо
public function clean($mode = 'matchingTag', $tags = array())
Ответить

Комментировать

*Логин:

*E-mail:
(сохранность гарантируем)

Сайт:

Aptana Class CodeIgniter Flash IDE JavaScript Linux PHP PostgreSQL SSH Ubuntu Zend Framework css jQuery online-приложения wordpress Базы данных Кэширование ООП Ссылки Типографика вдохновение вебдизайн виджеты дизайн заголовки инструменты поддомены разработка регистрация

Блог
Новости

Новости индустрии

Пожертвовать