Всем привет! Давайте поговорим о производительности популярной CMS/CMF Drupal, а именно — о 7-й версии.
Многие не самые опытные пользователи ругают Drupal за медлительность. Мол, на каждый запрос Drupal всегда загружается целиком, подгружая все-все-все свои модули. В целом они, возможно, и правы, такая проблема у Drupal есть, но она решаема.
В Drupal почти весь контент, который предназначен для посетителей — это сущности (entity), будь то ноды, пользователи или термины таксономии. Давайте с них и начнем.
Генерируем 1000 пользователей с помощью модуля devel_generate, который входит в devel и замеряем время их загрузки из БД.
Из примера видно, что эта операция занимает 30 секунд, что на самом деле не очень-то и хорошо. Что ж, как раз на этот случай в Drupal встроена собственная система для кеширования сущностей. Давайте посмотрим на неё в работе.
При повторном запуске эти пользователи загружаются уже за 2 секунды, что ж, молодец Drupal, но можно и лучше.
Скачиваем и включаем пару модулей (Entity cache и Memcache).
Модуль Entity cache позволяет кешировать стандартные сущности Drupal с использованием Cache API.
Memcache предоставляет возможность перенести заботу о кеше с MySQL на Memcached сервер, который хранит данные в оперативной памяти и соответственно быстрее с ними работает.
И — сходу успех, первый запуск выполняется всего за 2,8 секунды вместо 30. Идем дальше.
Повторный запуск, при котором данные достаются из кеша Memcached сервера выполняется за 0,4 секунды. Довольно неплохо в сравнении с кеширование по умолчанию в Drupal.
Однако, Memcached не единственный, подобные вещи может делать Redis.
Отключаем модуль Memcache и устанавливаем модуль Redis.
Первый запуск снова долгий, потому что кеш сперва сформировывается. В итоге — 2,2 секунды, пока это лучший результат.
0.35!
Таким образом, мы добились увеличения производительности в 13 раз в случае с первым запуском и в 5 раз в случае, когда данные берутся из кеша.
К сожалению, на хостинге не всегда есть возможность установить дополнительно сервер Memcached или Redis. В данном случае можно обойтись только модулем Entity cache.
Первый запрос исполняется довольно долго. Это опять же связано с генерацией кеша.
Зато все последующие выполняются меньше чем за секунду.
Отсюда можно сделать вывод, что модуль Entity cache — это must have модуль на любом Drupal сайте. Исходя из возможностей его можно дополнить Redis’ом.