AntiSlaed CMS
Вход
Логин: Пароль:Забыли пароль?
Запомнить вас на этом компьютере?
Войти скрытым?

Здравствуйте, Гость ( Вход | Регистрация )

> Внимание!

Адрес нашего форума изменился, теперь мы доступны по адресу antislaed.net. Обновите ссылки и закладки, он больше не изменится.


 
Ответить в данную темуНачать новую тему
> Кэш. Реализация кэширования в PHP.
wizard993
сообщение Sep 11 2011, 00:50
Сообщение #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
Перейти в начало страницы
 
     Выделите текст перед нажатием цитаты
+Цитировать сообщение
Immeasurability
сообщение Sep 14 2011, 11:06
Сообщение #2


Живу на АС
Иконка группы

Группа: Пользователи

Сообщений: 752
Регистрация:
11.12.2007
Из: Москва а так по всюду гы
Пользователь №: 1,591
Спасибо сказали: 154

Вставить ник




в елеанор реализовано 4 метода кеширования данных...

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

допустим мы сделали сложный запрос в базу данных который занял аж 1.0 секунду естественно каждый раз делать такой запрос не актуально, и мы результат помещаем в кеш а по надобности его берем обратно с условием если текущие данные не были изменены относительно уже имеющемуся кешу

отличие от статик в том что кеш глобален для всех пользователей и поэтому то что мы закешили использоваться будет и у остальных...
Immeasurability, Вас 1 раз(а) поблагодарили за это сообщение:
wizard993
Перейти в начало страницы
 
     Выделите текст перед нажатием цитаты
+Цитировать сообщение
vitalik1972
сообщение Sep 14 2011, 11:21
Сообщение #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
Перейти в начало страницы
 
     Выделите текст перед нажатием цитаты
+Цитировать сообщение
wizard993
сообщение Sep 14 2011, 20:59
Сообщение #4


Продвинутый юзверь
Иконка группы

Группа: Пользователи

Сообщений: 68
Регистрация:
29.1.2008
Из: Кубинка-8
Пользователь №: 2,152
Спасибо сказали: 10

Вставить ник




Отдельное спасибо каждому, ребят (IMG:http://antislaed.net/style_emoticons/default/smile.gif)
Так я понял, кеш надо хранить в какой-нибудь переменной?

ЦИТАТА(Immeasurability @ Sep 14 2011, 11:06 ) *
в елеанор реализовано 4 метода кеширования данных...

ну это как я понял какие-то сторонние алгоритмы. такие чудо-вещи типа eAccelerator`а и т.п.

ЦИТАТА(Immeasurability @ Sep 14 2011, 11:06 ) *
отличие от статик

имеется ввиду static - переменные / свойства классов? сорри, я просто ещё на таком уровне изучения, что могу не так понять сокращения)

Сообщение отредактировал wizard993: Sep 14 2011, 20:59
Перейти в начало страницы
 
     Выделите текст перед нажатием цитаты
+Цитировать сообщение
vitalik1972
сообщение Sep 15 2011, 08:35
Сообщение #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
Перейти в начало страницы
 
     Выделите текст перед нажатием цитаты
+Цитировать сообщение
wizard993
сообщение Sep 15 2011, 14:42
Сообщение #6


Продвинутый юзверь
Иконка группы

Группа: Пользователи

Сообщений: 68
Регистрация:
29.1.2008
Из: Кубинка-8
Пользователь №: 2,152
Спасибо сказали: 10

Вставить ник




ЦИТАТА(vitalik1972 @ Sep 15 2011, 08:35 ) *
Суть вот в чем:
Когда ты делаешь CApp::$Cache->put('Название_переменной','Значение переменной'); то в папке cache создается в файлик с именем 'Название переменной', куда и сериалиризуется значение данной переменной.

... а после, как я понимаю (чисто теоретически), есть какой-то кусок кода, который прежде, чем делать запрос в БД проверяет папку cache и смотрит, есть ли в ней файл с названием нашей переменной?

P.S. как я понял, сам механизм кэширования у тебя представлен в CCacheSerializer.php ?

И ещё такой вопрос: кэшировать можно только запросы в БД? или результат выполнения каких-то функций тоже можно кэшировать?
Перейти в начало страницы
 
     Выделите текст перед нажатием цитаты
+Цитировать сообщение
vitalik1972
сообщение Sep 15 2011, 19:20
Сообщение #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
Перейти в начало страницы
 
     Выделите текст перед нажатием цитаты
+Цитировать сообщение
wizard993
сообщение Sep 15 2011, 20:30
Сообщение #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
Перейти в начало страницы
 
     Выделите текст перед нажатием цитаты
+Цитировать сообщение
vitalik1972
сообщение Sep 15 2011, 20:45
Сообщение #9


Живу на АС
Иконка группы

Группа: Пользователи

Сообщений: 765
Регистрация:
10.6.2008
Из: Оренбург
Пользователь №: 4,176
Спасибо сказали: 211

Вставить ник




(IMG:http://antislaed.net/style_emoticons/default/smile.gif)
Перейти в начало страницы
 
     Выделите текст перед нажатием цитаты
+Цитировать сообщение

Ответить в данную темуНачать новую тему

5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0
 

RSS Текстовая версия Сейчас: 25 November 2024 - 11:59
Хостинг предоставлен NetLevel.Ru   Eleanor CMS