Не знаю, правильно ли я обозвал тему, прошу меня извинить, ввиду того, что совершенно не знаю предмет обсуждения.
Вопрос вот в чём. Изучая всем здесь известный движок - Eleanor CMS, я наткнулся на такую вещь, как кэширование. В альфа версии в файле core/core.php есть такое свойство - $Cache,#Кэш
Собственно хотелось бы узнать поподробней что такое КЭШ (статью на википедии читал, поэтому давайте не будем отвечать что-то типа "погугли". если я пишу топик здесь, а не в ответах гугл, то я хочу услышать адекватные пояснения), как он реализуется (хотя бы в общих чертах), принцип действия, какие-нибудь примеры. Если это где-то реализовано в Eleanor CMS, AntiSlaed CMS или в KiVi CMS, то подскажите где рыть.
в елеанор реализовано 4 метода кеширования данных...
суть кеширования поместить в память (запомнить) какой то массив данных полученный сложным путем, чтоб в последующем времени не повторять сложный алгоритм а сразу получить то что было проделано уже в готовом результате...
допустим мы сделали сложный запрос в базу данных который занял аж 1.0 секунду естественно каждый раз делать такой запрос не актуально, и мы результат помещаем в кеш а по надобности его берем обратно с условием если текущие данные не были изменены относительно уже имеющемуся кешу
отличие от статик в том что кеш глобален для всех пользователей и поэтому то что мы закешили использоваться будет и у остальных...
Immeasurability, Вас 1 раз(а) поблагодарили за это сообщение:
Расскажу как это реализовано в KiVi CMS и что кешируется: 1. Например сохраняем какую-либо запись (добавляем новость) в БД, в контроллере модуля просто пишем:
КОД
$this->model->save();
Данная функция в модели модуля смотрит, есть ли в КЕШЕ
КОД
CApp::get('название_таблицы');
сохраненная модель таблицы, если нет, то делается запрос DESCRIBE {pref}_название_таблицы, получается описание данной таблицы, обрабатывается и сохраняется в кеш:
КОД
CApp::put('название_таблицы',array(массив с описанием));
Так вот в СЛЕДУЮЩИЙ РАЗ при сохранении записи данный запрос выполняться не будет, потому, что он УЖЕ есть в кеше.
То же самое относится к таблице модулей, активных блоков, последних комментариев, списка файлов для autoloader-а. Суть кеша - держать как можно больше ВАЖНЫХ данных "поближе" к коду, для того, чтобы не исполнять запросы к БД.
vitalik1972, Вас 1 раз(а) поблагодарили за это сообщение:
Неее, не так... В KiVi CMS всего 1 класс для кеширования, хотя их может быть столько, сколько угодно (IMG:http://antislaed.net/style_emoticons/default/smile.gif) Суть вот в чем: Когда ты делаешь CApp::$Cache->put('Название_переменной','Значение переменной'); то в папке cache создается в файлик с именем 'Название переменной', куда и сериалиризуется значение данной переменной.
В элеаноре 4 метода, если не ошибаюсь memcache и eAccelerator еще что-то, один такой же как в KiViCMS. Я не посчитал нужным делать другие варианты кеша, как у санваса, хотя... никто не мешает (IMG:http://antislaed.net/style_emoticons/default/smile.gif)
vitalik1972, Вас 1 раз(а) поблагодарили за это сообщение:
Суть вот в чем: Когда ты делаешь CApp::$Cache->put('Название_переменной','Значение переменной'); то в папке cache создается в файлик с именем 'Название переменной', куда и сериалиризуется значение данной переменной.
... а после, как я понимаю (чисто теоретически), есть какой-то кусок кода, который прежде, чем делать запрос в БД проверяет папку cache и смотрит, есть ли в ней файл с названием нашей переменной?
P.S. как я понял, сам механизм кэширования у тебя представлен в CCacheSerializer.php ?
И ещё такой вопрос: кэшировать можно только запросы в БД? или результат выполнения каких-то функций тоже можно кэшировать?
$value = CApp::$Cache->get('Название переменной'); if (! $value) { // если в кеше переменной нет, то формируем ее // тут мы делаем что-то, например выполняем запрос к БД CApp::$Cache->put('Название переменной',$value); // записываем сформированную переменную в кеш }
И вот в этом месте у нас уже есть переменная в кеше var_dump($value);
Кешировать можно ВСЕ, любую переменную, массив, запрос к БД, полученные данные от БД, все что угодно.
Для примера вот код блока последних комментариев, постараюсь поподробнее описать все действия:
КОД
class CBlockLastComment extends CBlock { // Объявляем класс блока function run(){ CApp::$css->addFile('templates/'.CApp::getTheme().'/comments/comments.css'); // Подключаем стили для комментариев (если они есть) $comm = CApp::$Cache->Get('lastComments'); // Пытаемся получить из кеша последние комментарии if (! $comm) { // Если их нет, то формируем запрос к БД, выбираем последние пять с сортировкой по дате и привязкой к пользователям $res = CApp::$db->sql_query(' SELECT c.*, u.avatar FROM #_comment c LEFT OUTER JOIN #_users u ON c.uid = u.id ORDER BY c.`date` DESC LIMIT 5 '); $comm = CApp::$db->sql_fetchrowset($res); // Полученные данные положим в массив $comm CApp::$Cache->Put('lastComments', $comm); // И запишем его в кеш } $this->tpl->assign('rows', $comm); // Передаем данные в шаблон return $this->tpl->fetch('block/block-last-comment.tpl'); // Возвращем сформированный HTML код получившегося блока } }
Вот еще код самого шаблона для отображения комментариев (block/block-last-comment.tpl):