Статьи Архив статей

Автор: Мациевский Николай aka sunnybear
Опубликована: 2 июня 2009

Разгоняем Joomla! 1.5: от мифов к реальности

Наверняка уже многие слышали о медленной работе Joomla!, одной из самых популярных бесплатных CMS. Равно как и о ее сильной уязвимости для атак хакеров. Благодаря простоте создания расширений для Joomla!, сейчас доступно несколько (десятков) тысяч разнообразных модулей, компонентов и расширений, позволяющих установить на сайт практически произвольный функционал: от полноценной социальной сети до интернет-магазина.

Естественно, что у такой простоты есть и обратная сторона: большинство расширений создаются без учета требований высокой производительности и какой-либо оглядки на мощности конечных серверов, очень часто даже не выделенных или виртуальных, а расположенных на общем хостинге. Разработка бесплатных решений оборачивается 100-500% замедлением в скорости загрузки сайта. Давайте разбираться, как с этим можно бороться.

Серверная часть

Для начала посмотрим, что можно сделать с серверной производительностью. Для исследования использовалась стандартная сборка Joomla!, но даже в такой комплектации на отдельном сервере время создания страницы занимало 0,312с (замер времени ответа производился с помощью curl, интерфейс к которому выложен на webo.in). Это не очень много, но в условиях виртуального хостинга может возрасти многократно, даже на изначально хорошо оптимизированных окружениях.

Встроенное кэширование в Joomla! 1.5 работает достаточно хорошо и позволяет сэкономить существенное время при создании страницы. Однако нужно понимать, что оно может быть применимо далеко не для всякой системы. В случае статичных новостных сайтов и небольших интернет-магазинов кэширование может помочь, но для социальных сетей с активным добавлением новых материалов и их комментированием оно точно не подойдет.

Кэширование на стороне сервера

Включение встроенного кэширования в Joomla! 1.5 сократило время ответа тестируемого сервера примерно на 30% (на 0,107с). Прекрасно понятно, что в большинстве случаев оно будет практически бесполезно: если необходимо сократить время создания страниц на порядок, то нужны более кардинальные методы.

В качестве одного из кэширующих решений может использоваться и Web Optimizer: встроенное кэширование HTML-документов позволяет отдавать их сразу в том виде, в котором они получаются системой после всех запросов к базе. При этом, естественно, практически все эти запросы не осуществляются. Данное кэширование («монолитное») подойдет только в тех случаях, когда внешние страницы у Joomla! меняются относительно редко.

Если просто включить Web Optimizer в процесс создания страниц, то время обработки документа возрастет незначительно (после создания всех кэширующих файлов на 0,006с или 3% на тестовом сервере). Дополнительно включив HTML-кэширование в Web Optimizer, можно сократить время отдачи документа до 0,08с (почти в 4 раза по сравнению с исходным временем создания страницы). Сразу хочу отметить, что установка вроде аналогичного по функциональности дополнения Content Static визуально на производительности никак не отразилась.

Очевидно, что более грамотным будет кэшировать отдельные модули на странице, оставляя нужные места (или как их любят называть в шаблонных движках — заглушки) динамическими. Однако данное решение требует существенного вмешательства в алгоритм работы самой CMS. Дополнение System-Cache (включено в сборку по умолчанию) работает именно по такому принципу и на данный момент обеспечивает практически наилучшую производительность (при большой стабильности алгоритма).

Заканчивая речь про кэширования создаваемых страниц на стороне сервера стоит упомянуть, что дополнение Joomla Performance Booster показало результаты примерно на 50% (пятикратный прирост производительности по сравнению с «обычной» версией) лучше, чем System-Cache, однако может работать не настолько стабильно.

Кэширование запросов к базе данных

К серверному кэшированию можно подойти и с другой стороны: ограничить число запросов к базе данных, обычно именно эта часть вызывает наиболее серьезную «утечку» производительности. Для Joomla! существует расширение, позволяющее закэшировать все (или почти все) запросы к базе. Тут стоит понимать, что база данных сама по себе может работать достаточно быстро, и данное решение будет эффективно только в том случае, если восстановление закэшированного значения выборки на порядок (или хотя бы в разы) быстрее, чем осуществление самой выборки (например, 1 мс против 10 мс). В противном случае прироста производительности не появится.

Дополнение Query Cache позволяет использовать как файловую систему, так и популярные кэширующие подсистемы (APC, Memcache и др.) для сохранения выполненных запросов. Однако в случае только файловой системы «завести» кэш не удалось.

Клиентская часть

Для оценки эффективности решений для клиентской оптимизации будем использовать зарекомендовавший (и относительно беспристрастный :) YSlow.

«Чистая» система

«Чистая» установка Joomla! 1.5 набрала 65 баллов из 100. Вполне приемлемо. Стоит понимать, что если на систему просто «навернуть» десяток модулей и компонентов, то оценка резко ухудшится до 30-40.

Следующий этап: архивирование

В Joomla! есть встроенный gzip. Однако, во-первых, он работает через PHP, во-вторых только для HTML-файлов. Грустно, что и отразилось на оценке: она поднялась только до 67.

CssJsCompress

Довольно известное дополнение, позволяющее объединять CSS- и JS-файлы. Однако, не добавляет к ним всех кэширующих заголовков и сжатия, что и отразилось на результате: всего 72 балла по YSlow. В самой Joomla! gzip при этом был включен. Дополнение CSS/JS Cache не удалось заставить корректно работать.

Joomla Performance Booster

Joomla Performance Booster является платным дополнением (39 евро) и представляет собой наиболее мощное «встроенное» решение для Joomla! 1.5. После его установки и натройки (объединение JavaScript работало «со скрипом», и его пришлось выключить) был достигнут результат в 73 балла (вполне вероятно, что при правильной работе с JavaScript оценка YSlow поднялась бы и до 75). В целом достаточно мощное дополнение, поскольку обеспечивает кроме самого кэширования еще и очень гибкое управление созданным кэшем.

Smart Optimizer

Далее был протестирован Smart Optimizer (как отдельное PHP-приложение) — по характеру работы полностью аналогичный известному Minify (дополнение Minify4Joomla «завести» не удалось). Установка у него достаточно сложная для непрофессионала, к тому же приходится править шаблоны вручную, нет возможности объединять файлы из разных директорий. Однако все остальное на высоте: оценка поднялась до 85. В самой Joomla! gzip при этом был включен.

Web Optimizer

Web Optimizer (как отдельное PHP-приложение), естественно, устанавливается в «два клика» и обладает более мощным клиентским арсеналом: при отключенном сжатии в самой Joomla! оценка поднялась до 93 (с 65 изначально). Думаю, тут уже дополнительных комментариев не нужно.

Заключение

На данный момент для Joomla! 1.5 не удалось найти более мощного бесплатного решения для оптимизации производительности, чем Web Optimizer. PHP Speedy доступен пока только для Joomla! 1.0, а Joomla Performance Booster является платным (если удастся оформить перевод денег, то скоро будет выложен и его обзор).

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

WEBO Site SpeedUp — продукт для автоматического ускорения Joomla!

Читать дальше

Все комментарии (habrahabr.ru)