Заметки интернет-разработчика

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

На многих сайтах есть информационные блоки, которые показывают одну и ту же информацию на всех страницах сайта. Например, последние новости, последние статьи, контакты. Самый простой спобов вывода таких блоков - функция s_list_class, но как я уже писал, она слишком ресуркоемкая для простых операций. Наилучшим способом оптимизации вывода таких блоков является кеширование, поскольку эти блоки обновляются очень редко по сравнению с количеством их просмотров.

При кешировании данных, возникает вопрос о том где их хранить. Если мы используем файлы, то для получения этих данных нужно будет дополнительно считать их с диска. Но можно избежать дополнительных запросов, если хранить кэшируемые данные вместе с системными данными которые и так считываются при каждом создании страницы. В качестве таких хранилищ можно использовать поля сайта или раздела. Если выодимая информация зависит от раздела, то сохранять кеш нужно в полях раздела, если на всем сайте она не меняется, то в полях сайта.

Рассмотрим на примере кеширования блока новстей. Кеш должен обновляться при добавлении новости, редактировании новости и удалении новости.

  1. Создадим дополнительное поле в настройках сайта.
    Разработка -> Системные таблицы -> Поля таблицы сайты. Добавим поле "NewsBlock" с описанием "Блок новостей (кэш)", тип: текстовый блок. Ставим галочку "наследовать значение поля".

  2. Добавим сохранение кеша при добавлении и изменении новостей.
    Разработка -> Список компонентов -> Добавление -> Действие после добавления объекта. Генерируем код действия если поле пустое. Добавлем следующий код:
    $admin_mode=0;
    $news=s_list_class(123,456,"recNum=3&nc_title=1",1);
    $db->query("UPDATE Catalogue SET NewsBlock='".mysql_real_escape_string($news)."' WHERE Catalogue_ID=$catalogue");
    Аналогично для действия после изменения объекта, действие после включения и выключения объекта, действие после удаления объекта.

  3. Заменим в макете вызов функции
    ".s_list_class(123,456,"recNum=3&nc_title=1",1)." на поле сайта $current_catalogue[NewsBlock]


--
Тренинг искусство презентации.

Комментарии (5) »

  1. Александр, 2008-10-26 @ 19:08

    Круто. Спасибо.

  2. 10 заповедей разработчика на NetCat | Блогнот, 2008-11-03 @ 11:30

    [...] минимальным выполнением php кода. Но лучше всего будет кешировать такие блоки.Используйте функции opt() и opt_case() только для вывода html. [...]

  3. Andry, 2008-12-19 @ 03:02

    Почему то когда добавляю
    $news=s_list_class(123,456,"recNum=3&nc_title=1",1);
    то данные сохраняются в кэш, но не совсем те, а данные с блоком для редактирования

    Меняю на
    $news=s_list_class(123,456,"recNum=3&nc_title=1");
    т.е, убираю ",1" вконце и данные в кэш уже не сохраняются, поле пустое.

    В чем проблема то?

  4. Andry, 2008-12-19 @ 03:51

    И что делать с $fullLink ? зачем нужен путь в ружиме редактирования. Как подставить нормальный?

  5. yakodzun, 2008-12-19 @ 08:30

    чтоб убрать блок редактирования нужно перед $news=s_list_class ... вставить строку
    $admin_mode=0;
    также это решит проблему с $fullLink

Оставить комментарий

Комментарии модерируются

Имя: (Обязательно)

E-mail: (Обязательно)

URL:

Comment:

Page generated in 0.0320 seconds with 11 queries (0.0192 seconds of sql)