Расскажу немного предыстории. Вчера, бродя по панелям для веб-мастеров, я заметил, что почти каждая из них жалуется на слишком долгий ответ, а Google и вовсе написал, что мой сайт медленнее 80% сайтов интернета. «Да чйорт побъери» — сказал я себе и полез смотреть, что же не так. Теперь приготовьтесь к захватывающему расследованию, в котором я раскрою тайну Premium шаблонов для WordPress, плагинов кеширования и многого другого.
С установкой новой премиум-темы, я заметил, что фронт-энд (то что видит юзер) стал медленно подгружаться. В связи с этим, я начал гуглить на тему плагинов кеширования. Самым крутым, оказался плагин от одного из разработчиков WordPress — WP Super Cache. Скачал, включил, выставил ttl (время жизни) 3600 и забыл.
Вчера же, в статистике гугля, я заметил график скорости загрузки роботом страниц этого блога. Результат просто шокирующий. Без установленного плагина кеширования, скорость загрузки страницы могла достигать 23 секунды. Почесав затылок, я принялся разбираться, в чём же может быть дело.
Глава 1. Хостер
Первым делом, помчался к хостеру, с бочками на него, дескать «канала дай пошире, да оперативы побольше». После чего, соответственно, был вежливо послан. Ну думаю ладно, подправлю memory_limit черех хтакес (.htaccess) и буду счастлив. Сказал — сделал. Теперь я как «парень», жмякаю f5 в ожидании чудо-прироста скорости работы, но в ответ... Вы догадались :)
В итоге, дабы посмотреть расходуемую память и количество запросов, я вставил в шаблон простой код:
<?php if (current_user_can('level_10')){ ?>
<?php echo " Запросов: " . get_num_queries() . " | "; timer_stop(1). "секунд";
if ( function_exists('memory_get_usage') )
echo ' Потребление памяти: ' . round(memory_get_usage()/1024/1024, 2) . 'MB '; ?>
<?php }?>
И я ужаснулся! 234 запроса к базе данных!! 234 мать его так! И скромных 9мб оперативки. И каждый юзер из 900 зашедший на сайт за сутки, запускает эти же самые 234 запроса( (900*234)/86400 =2.5 запроса в секунду). И это всё для Shared хостинга. Вместе со мной хостится ещё пяток-другой сайтов. Имхо, дофига со включенным кешем-то :) Заглянул в активные плагины, насчитал 35 штук, но ни от какого я не могу отказаться. Хостер — не виновен.
Глава 2. Оптимизация WordPress плагинами
Выше, я уже обмолвился о плагине WP Super Cache. Сильный плагин, однако его явно было мало. Кешированная страничка грузилась почти 12 секунд, что даже для человека неприемлемо, не говоря о боте. Поэтому, предпринял попытку поиска плагина, кеширующего запросы к базе данных. И он есть! И действительно работает! Встречайте: db cache reloaded! После установки этого плагина, кол-во запросов сократилось в 2.4 раза! С 234 до 98. Снизив нагрузку на хостинге до 1 запроса в секунду.
Глава 3. Премиум темы для WordPress (Premium Themes)
Пока был на тренировке, из головы не вылазили мысли, как оптимизировать ещё. Ведь в настройках DB Cache Reloader указаны «постфиксы» функций, которые не должны кешироваться. По дефолту: _posts, _postmeta. И меня осенило, что количество запросов, можно снизить, убрав виджеты. Особенно те, которые хоть как-то связаны с постами блога или используют не кеширующиеся функции. Убрав эти виджеты, кол-во запросов снизилось до 50!!
В премиум шаблонах, часто есть настройки. И как оказывается, чем больше их — тем хуже. Особенно, если тема хранит их не в своём конфиг-файле, а в базе данных. Представим, что тема имеет 50 настроек (как Headlines от WooThemes, которая стояла у меня раньше). Значит, что по телу шаблона раскидано как минимум 50 запросов к базе данных, которые содержаться в функции get_option — именно она обращается в базу за значением настройки. Идеальный вариант для темы — это при загрузке шаблона, выбрать «одним махом» все свои переменный в массив и уже работать с ним, а не с базой. Пусть это будет 3-5 запросов, но не 50 же!
Глава 4. Пингдом (pingdom.com)
Есть такой замечательный сервис, как пингдом. Он позволяет замерить скорость загрузки сайта. На протяжении всех глав, я тестировал сайт на время загрузки. После убирания всех лишних виджетов, удалось снизить скорость загрузки страницы до 6-8 секунд. Но внутри, я ощущал, что можно ускорить ещё на пару секунд. Проанализировав выдачу пингдома, я понял, что тема генерирует слишком много «мусора» в виде: css, js, thumb и мелко-файлов оформления. В итоге, браузеру приходится грузить 100 объектов. Это значит, что даже за малейшим css файлом, ему нужно сделать «лишний» запрос. И таких «лишних запросов» я насчитал штук 70. Отключив все рюшки темы, я добился 70 объектов. НО! Тема потеряла свой товарный вид начисто. Поэтому я решил вернуться на старую и простую тему iNove. Настроил виджеты, сбросил кеш, обновил страничку и оторопел...
9 запросов и просто рекордное время генерации странички!!! Почти половина секунды! А вам слабо?
Разница просто очевидна. Из 234 запросов, осталось 9, а это в 26 раз меньше чем было изначально. Т.е. запрос в базу раз в 10 секунд. Не считая кешированных страниц, для которых тоже не используются запросы к базе. А что же со временем загрузки? Из-за того, что тема iNove очень простая, кол-во объектов для загрузки уменьшилось до 28 (со 100, почти в 3 раза меньше). И вот он, результат:
3.4 секунды — полная загрузка главной страницы. Для внутренних страниц, определяется наличием кеша и количеством контента. Но для shared-хостинга и блога с растущим трафиком, согласитесь, это хороший показатель.
Глава 5. Что ещё можно оптимизировать?
Вот в друпале, есть хорошая функция: «упаковка js и css». В итоге, вместо 20 файлов выходит только 2. В вордпрессе, некоторые разработчики принимают отчаянные попытки сделать тоже самое, но у них это не получается. Я протестировал три плагина:
- php Speedy — плагин жмёт и css и JS, при этом сообщает об ошибках, множество настроек. Однако со включенным модулем, сайт стал значительно медленнее грузиться. Время генерации страницы выросло до 2.2 секунд, вместо 0.6
- Css Compressor — плагин 2005-го года, однако совместим с WordPress 2.9.1. Не прихватил все CSS, взял только css от темы, плуги обошёл стороной.
- Js Compressor — жмёт и js и css. Плагин вроде бы предпринимал отчаянные попытки создания кеша и минимизации Css и JS, однако на деле применить их не смог. Считаю плагин нерабочим.
Постскриптум
У меня на хостинге установлены nginx + eAccelerator, которые тоже дают прирост производительности. Nginx — жмёт трафик в gzip, а eAccelerator — создаёт кеш исполняемых файлов. Можете нагуглить про работу и первого, и второго. Однако судя по phpinfo (), акселератор настроен неправильно (имхо). Так же, для себя, я решил что подумаю 20 раз прежде чем буду использовать очередную премиум тему для блога. Здесь лучший вариант: чем проще — тем лучше. Пусть юзеры грузят картинки и видео, а не элементы дизайна по 20 секунд.
Пробуйте, отписывайте, может быть у вас есть советы по улучшению.Рекомендую прочитать:
- Оптимизация VPS для WordPress 3.0 (1)
- Новая бесплатная тема для WordPress: IceBurgg (4)
- Заметки для WordPress программистов (11)
- О важности наличия мобильной версии сайта (0)
- Сборки различных CMS — прибыльное дело! (0)
- Фишки WordPress (6)
- Как сменить иконки в Windows 7? (22)
- Windows 7 и Windows XP на одном компьютере, но с разными HDD (13)
- От любви до ненависти к Google Chrome (24)
