![]() |
![]() |
ВходЗдравствуйте, Гость ( Вход | Регистрация )
|
![]() ![]() |
![]() |
![]() ![]()
Сообщение
#1
|
|
Продвинутый юзверь ![]() Группа: Пользователи Сообщений: 68 Регистрация: 29.1.2008 Из: Кубинка-8 Пользователь №: 2,152 Спасибо сказали: 10 Вставить ник ![]() |
Не знаю, правильно ли я обозвал тему, прошу меня извинить, ввиду того, что совершенно не знаю предмет обсуждения.
Вопрос вот в чём. Изучая всем здесь известный движок - Eleanor CMS, я наткнулся на такую вещь, как кэширование. В альфа версии в файле core/core.php есть такое свойство - $Cache,#Кэш Собственно хотелось бы узнать поподробней что такое КЭШ (статью на википедии читал, поэтому давайте не будем отвечать что-то типа "погугли". если я пишу топик здесь, а не в ответах гугл, то я хочу услышать адекватные пояснения), как он реализуется (хотя бы в общих чертах), принцип действия, какие-нибудь примеры. Если это где-то реализовано в Eleanor CMS, AntiSlaed CMS или в KiVi CMS, то подскажите где рыть. Извините, если где-то неправильно выразился, ибо я плохо представляю этого зверя (IMG:http://antislaed.net/style_emoticons/default/sad.gif) P.S. может кто-нибудь посоветует какую-нибудь литературу Заранее большое спасибо. Сообщение отредактировал wizard993: Sep 11 2011, 19:13 |
|
|
![]()
Сообщение
#2
|
|
Живу на АС ![]() Группа: Пользователи Сообщений: 752 Регистрация: 11.12.2007 Из: Москва а так по всюду гы Пользователь №: 1,591 Спасибо сказали: 154 Вставить ник ![]() |
в елеанор реализовано 4 метода кеширования данных...
суть кеширования поместить в память (запомнить) какой то массив данных полученный сложным путем, чтоб в последующем времени не повторять сложный алгоритм а сразу получить то что было проделано уже в готовом результате... допустим мы сделали сложный запрос в базу данных который занял аж 1.0 секунду естественно каждый раз делать такой запрос не актуально, и мы результат помещаем в кеш а по надобности его берем обратно с условием если текущие данные не были изменены относительно уже имеющемуся кешу отличие от статик в том что кеш глобален для всех пользователей и поэтому то что мы закешили использоваться будет и у остальных... |
Immeasurability, Вас 1 раз(а) поблагодарили за это сообщение: wizard993 | |
|
|
![]()
Сообщение
#3
|
|
Живу на АС ![]() Группа: Пользователи Сообщений: 765 Регистрация: 10.6.2008 Из: Оренбург Пользователь №: 4,176 Спасибо сказали: 211 Вставить ник ![]() |
Расскажу как это реализовано в KiVi CMS и что кешируется:
1. Например сохраняем какую-либо запись (добавляем новость) в БД, в контроллере модуля просто пишем: КОД $this->model->save(); Данная функция в модели модуля смотрит, есть ли в КЕШЕ КОД CApp::get('название_таблицы'); сохраненная модель таблицы, если нет, то делается запрос DESCRIBE {pref}_название_таблицы, получается описание данной таблицы, обрабатывается и сохраняется в кеш: КОД CApp::put('название_таблицы',array(массив с описанием)); Так вот в СЛЕДУЮЩИЙ РАЗ при сохранении записи данный запрос выполняться не будет, потому, что он УЖЕ есть в кеше. То же самое относится к таблице модулей, активных блоков, последних комментариев, списка файлов для autoloader-а. Суть кеша - держать как можно больше ВАЖНЫХ данных "поближе" к коду, для того, чтобы не исполнять запросы к БД. |
vitalik1972, Вас 1 раз(а) поблагодарили за это сообщение: wizard993 | |
|
|
![]()
Сообщение
#4
|
|
Продвинутый юзверь ![]() Группа: Пользователи Сообщений: 68 Регистрация: 29.1.2008 Из: Кубинка-8 Пользователь №: 2,152 Спасибо сказали: 10 Вставить ник ![]() |
Отдельное спасибо каждому, ребят (IMG:http://antislaed.net/style_emoticons/default/smile.gif)
Так я понял, кеш надо хранить в какой-нибудь переменной? в елеанор реализовано 4 метода кеширования данных... ну это как я понял какие-то сторонние алгоритмы. такие чудо-вещи типа eAccelerator`а и т.п. отличие от статик имеется ввиду static - переменные / свойства классов? сорри, я просто ещё на таком уровне изучения, что могу не так понять сокращения) Сообщение отредактировал wizard993: Sep 14 2011, 20:59 |
|
|
![]()
Сообщение
#5
|
|
Живу на АС ![]() Группа: Пользователи Сообщений: 765 Регистрация: 10.6.2008 Из: Оренбург Пользователь №: 4,176 Спасибо сказали: 211 Вставить ник ![]() |
Неее, не так...
В 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 раз(а) поблагодарили за это сообщение: wizard993 | |
|
|
![]()
Сообщение
#6
|
|
Продвинутый юзверь ![]() Группа: Пользователи Сообщений: 68 Регистрация: 29.1.2008 Из: Кубинка-8 Пользователь №: 2,152 Спасибо сказали: 10 Вставить ник ![]() |
Суть вот в чем: Когда ты делаешь CApp::$Cache->put('Название_переменной','Значение переменной'); то в папке cache создается в файлик с именем 'Название переменной', куда и сериалиризуется значение данной переменной. ... а после, как я понимаю (чисто теоретически), есть какой-то кусок кода, который прежде, чем делать запрос в БД проверяет папку cache и смотрит, есть ли в ней файл с названием нашей переменной? P.S. как я понял, сам механизм кэширования у тебя представлен в CCacheSerializer.php ? И ещё такой вопрос: кэшировать можно только запросы в БД? или результат выполнения каких-то функций тоже можно кэшировать? |
|
|
![]()
Сообщение
#7
|
|
Живу на АС ![]() Группа: Пользователи Сообщений: 765 Регистрация: 10.6.2008 Из: Оренбург Пользователь №: 4,176 Спасибо сказали: 211 Вставить ник ![]() |
Да, ты прав. Обычно я делаю так:
КОД $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): КОД <ul>
{foreach from=$rows item=row} <li> <a href="index.php?name={$row['modul']}&op=view&id={$row['cid']}">{$row['comment']|strip_tags|truncate:40:'…'}</a> </li> {/foreach} </ul> Сообщение отредактировал vitalik1972: Sep 15 2011, 20:45 |
vitalik1972, Вас 1 раз(а) поблагодарили за это сообщение: wizard993 | |
|
|
![]()
Сообщение
#8
|
|
Продвинутый юзверь ![]() Группа: Пользователи Сообщений: 68 Регистрация: 29.1.2008 Из: Кубинка-8 Пользователь №: 2,152 Спасибо сказали: 10 Вставить ник ![]() |
vitalik1972 я уже устал тебе "спасибо говорить" (IMG:http://antislaed.net/style_emoticons/default/smile.gif) Теперь всё понятно. Спасибо ещё раз огромное! и спасибо за комментарии
Сообщение отредактировал wizard993: Sep 15 2011, 20:46 |
|
|
![]()
Сообщение
#9
|
|
Живу на АС ![]() Группа: Пользователи Сообщений: 765 Регистрация: 10.6.2008 Из: Оренбург Пользователь №: 4,176 Спасибо сказали: 211 Вставить ник ![]() |
|
|
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25 April 2025 - 13:34 |