Повышаем
производительность
   Drupal-сайта




    Колос Владимир Анатольевич
Проблемы
производительности
Страница долго грузится:
   Нет должного кэширования данных
   Используются не оптимальные алгоритмы
   Выполняется куча непонятных SQL-запросов
   Долго загружаются модули
   Страницу долго отдаёт Web-сервер

Последствия:
   Сервер загружен на полную
   Посетитель закрыл вкладку с Вашим сайтом
   Ваш хостер отказал Вам в размещении сайта
Готовые решения


Список модулей:
  Boost
  Cache Router
  Authcache
  Block Cache Alter
  Path Cache
  Javascript Aggregator
  CSS Gzip
Готовые решения > Boost

Аудитория………..: анонимные пользователи
Цель……………….: кэширование страниц
Эффективность…: очень высокая
Возможности…….:
   Хранилище кэша: File
   Отдача закэшированной страницы происходит без участия
   PHP и MySQL
   Настраиваемое время жизни для каждой страницы
   Сжатие CSS и JavaScript
   Поддержка мультисайтов
   Модуль работает даже на недорогом хостинге
Готовые решения > Cache
Router
Аудитория………..: все
Цель………………: изменение хранилища по-умолчанию
Эффективность…: очень высокая
Возможности…….:
   Хранилище кэша: APC, XCache, eAccelerator, Memcache, File,
   Database
   Для разных таблиц кэша можно использовать различные
   хранилища
   Поддержка мультисайтов
Готовые решения > Authcache

Аудитория………..: все
Цель……………….: кэширование страниц
Эффективность…: очень высокая
Возможности…….:
   Хранилище кэша: любое из поддерживаемых модулей
   CacheRouter
   Кэширование настраивается по ролям пользователей
   Список исключений страниц из кэширования
   Загрузка динамических блоков на страницу происходит через
   Ajax
Готовые решения > Block Cache
Alter
Аудитория………..: все
Цель………………: кэширование блоков
Эффективность…: умеренная
Возможности…….:
   Настройки кэша: кэш отключён, глобальное кэширование,
   кэширование для страницы, кэширование для роли,
   кэширование для пользователя
   Синхронизация обновления кэша с: обновлением страницы,
   обновлением ноды, обновлением комментария, регистрацией
   нового пользователя, входом или выходом пользователя
   Время жизни кэша
Готовые решения > Path Cache

Аудитория………..: все
Цель……………….: кэширование преобразований пути
Эффективность…: умеренная
Возможности…….:
   Кэширование преобразований алиаса в системный путь
Готовые решения > Javascript
Aggregator
Аудитория………..: все
Цель……………….: сжатие JavaScript файлов
Эффективность…: умеренная
Возможности…….:
   Агрегация всех JavaScript файлов в один
   Минимизация JavaScript файла (Minify)
   Сжатие JavaScript файла используя GZip
Готовые решения > CSS Gzip

Аудитория………..: все
Цель……………….: сжатие CSS файлов
Эффективность…: умеренная
Возможности…….:
   Агрегация всех CSS файлов в один
   Сжатие CSS файла используя GZip
Советы при создании собственных
модулей
 Используйте Drupal Cache API
 Используйте статическое кэширование внутри собственных
 функций
 В функцию node_load передавайте только ID ноды в качестве
 первого аргумента
 Не используйте стиль отображения “Материал” в Views
 Используйте свою собственную функцию для получения
 значения одного или нескольких CCK-полей вместо загрузки
 всей ноды используя node_load()
 При массовой загрузке синонимов и связанных терминов
 таксономии используйте свою собственную функцию
Советы при создании собственных
модулей > Примеры

Drupal Cache API

Получение данных из кэша
cache_get($sid, $table = ‘cache’)

Добавление данных в кэш
cache_set($sid, $data, $table = ‘cache’, $expire = 0, $headers = null)

Очистка кэша
cache_clear_all($cid = NULL, $table = NULL, $wildcard = FALSE)
Советы при создании собственных
модулей > Примеры

Статическое кэширование внутри функций

function taxonomy_get_term($tid, $reset = FALSE) {
   static $terms = array();
   if ($reset) {
       $terms = array();
   }
   if (!isset($terms[$tid])) {
       // находим нужный термин используя SQL запрос
   }
   return $terms[$tid];
}
Советы при создании собственных
модулей > Примеры

В node_load передавайте только ID ноды

Статическое кэширование в функции работает
node_load(1);

Статическое кэширование в функции не работает
node_load(array(‘nid’ => 1));
node_load(array(‘nid’ => 1, ‘type’ => ‘page’));
Советы при создании собственных
модулей > Примеры

Массовая работа с терминами таксономии

Собственная функция выполнится быстрей с одним SQL запросом
$tids = array(1, 2, 3, 4, 5, …);
get_terms_relations($tids);

Чем цикл с родной функцией модуля taxonomy
$tids = array(1, 2, 3, 4, 5, …);
foreach ($tids as &$tid) {
    $tid = taxonomy_get_related($tid);
}
Спасибо за внимание

Ссылки
  Boost http://drupal.org/project/boost
  Cache Router http://drupal.org/project/cacherouter
  Authcache http://drupal.org/project/authcache
  Block Cache Alter http://drupal.org/project/blockcache_alter
  Path Cache http://drupal.org/project/pathcache
  Javascript Aggregator http://drupal.org/project/javascript_aggregator
  CSS Gzip http://drupal.org/project/css_gzip
  Полный список http://groups.drupal.org/node/21897

Повышаем производительность Drupal-сайта

  • 1.
    Повышаем производительность Drupal-сайта Колос Владимир Анатольевич
  • 2.
    Проблемы производительности Страница долго грузится: Нет должного кэширования данных Используются не оптимальные алгоритмы Выполняется куча непонятных SQL-запросов Долго загружаются модули Страницу долго отдаёт Web-сервер Последствия: Сервер загружен на полную Посетитель закрыл вкладку с Вашим сайтом Ваш хостер отказал Вам в размещении сайта
  • 3.
    Готовые решения Список модулей: Boost Cache Router Authcache Block Cache Alter Path Cache Javascript Aggregator CSS Gzip
  • 4.
    Готовые решения >Boost Аудитория………..: анонимные пользователи Цель……………….: кэширование страниц Эффективность…: очень высокая Возможности…….: Хранилище кэша: File Отдача закэшированной страницы происходит без участия PHP и MySQL Настраиваемое время жизни для каждой страницы Сжатие CSS и JavaScript Поддержка мультисайтов Модуль работает даже на недорогом хостинге
  • 5.
    Готовые решения >Cache Router Аудитория………..: все Цель………………: изменение хранилища по-умолчанию Эффективность…: очень высокая Возможности…….: Хранилище кэша: APC, XCache, eAccelerator, Memcache, File, Database Для разных таблиц кэша можно использовать различные хранилища Поддержка мультисайтов
  • 6.
    Готовые решения >Authcache Аудитория………..: все Цель……………….: кэширование страниц Эффективность…: очень высокая Возможности…….: Хранилище кэша: любое из поддерживаемых модулей CacheRouter Кэширование настраивается по ролям пользователей Список исключений страниц из кэширования Загрузка динамических блоков на страницу происходит через Ajax
  • 7.
    Готовые решения >Block Cache Alter Аудитория………..: все Цель………………: кэширование блоков Эффективность…: умеренная Возможности…….: Настройки кэша: кэш отключён, глобальное кэширование, кэширование для страницы, кэширование для роли, кэширование для пользователя Синхронизация обновления кэша с: обновлением страницы, обновлением ноды, обновлением комментария, регистрацией нового пользователя, входом или выходом пользователя Время жизни кэша
  • 8.
    Готовые решения >Path Cache Аудитория………..: все Цель……………….: кэширование преобразований пути Эффективность…: умеренная Возможности…….: Кэширование преобразований алиаса в системный путь
  • 9.
    Готовые решения >Javascript Aggregator Аудитория………..: все Цель……………….: сжатие JavaScript файлов Эффективность…: умеренная Возможности…….: Агрегация всех JavaScript файлов в один Минимизация JavaScript файла (Minify) Сжатие JavaScript файла используя GZip
  • 10.
    Готовые решения >CSS Gzip Аудитория………..: все Цель……………….: сжатие CSS файлов Эффективность…: умеренная Возможности…….: Агрегация всех CSS файлов в один Сжатие CSS файла используя GZip
  • 11.
    Советы при созданиисобственных модулей Используйте Drupal Cache API Используйте статическое кэширование внутри собственных функций В функцию node_load передавайте только ID ноды в качестве первого аргумента Не используйте стиль отображения “Материал” в Views Используйте свою собственную функцию для получения значения одного или нескольких CCK-полей вместо загрузки всей ноды используя node_load() При массовой загрузке синонимов и связанных терминов таксономии используйте свою собственную функцию
  • 12.
    Советы при созданиисобственных модулей > Примеры Drupal Cache API Получение данных из кэша cache_get($sid, $table = ‘cache’) Добавление данных в кэш cache_set($sid, $data, $table = ‘cache’, $expire = 0, $headers = null) Очистка кэша cache_clear_all($cid = NULL, $table = NULL, $wildcard = FALSE)
  • 13.
    Советы при созданиисобственных модулей > Примеры Статическое кэширование внутри функций function taxonomy_get_term($tid, $reset = FALSE) { static $terms = array(); if ($reset) { $terms = array(); } if (!isset($terms[$tid])) { // находим нужный термин используя SQL запрос } return $terms[$tid]; }
  • 14.
    Советы при созданиисобственных модулей > Примеры В node_load передавайте только ID ноды Статическое кэширование в функции работает node_load(1); Статическое кэширование в функции не работает node_load(array(‘nid’ => 1)); node_load(array(‘nid’ => 1, ‘type’ => ‘page’));
  • 15.
    Советы при созданиисобственных модулей > Примеры Массовая работа с терминами таксономии Собственная функция выполнится быстрей с одним SQL запросом $tids = array(1, 2, 3, 4, 5, …); get_terms_relations($tids); Чем цикл с родной функцией модуля taxonomy $tids = array(1, 2, 3, 4, 5, …); foreach ($tids as &$tid) { $tid = taxonomy_get_related($tid); }
  • 16.
    Спасибо за внимание Ссылки Boost http://drupal.org/project/boost Cache Router http://drupal.org/project/cacherouter Authcache http://drupal.org/project/authcache Block Cache Alter http://drupal.org/project/blockcache_alter Path Cache http://drupal.org/project/pathcache Javascript Aggregator http://drupal.org/project/javascript_aggregator CSS Gzip http://drupal.org/project/css_gzip Полный список http://groups.drupal.org/node/21897