Ускоряем WordPress на максимум

Расскажу немного предыстории. Вчера, бродя по панелям для веб-мастеров, я заметил, что почти каждая из них жалуется на слишком долгий ответ, а 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 раза меньше). И вот он, результат:

самая быстрая загрузка WordPress3.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 секунд.

Пробуйте, отписывайте, может быть у вас есть советы по улучшению.

Рекомендую прочитать:

About arti

Php-программист со стажем в 5 лет. Люблю путешествовать и знакомиться с новыми людьми. Женат на самой красивой и лучшей девушке в мире: Дашеньке.

, , , , , ,

  • Vic

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

  • http://wwwlab.biz Артур

    @Vic

    Я отключил их, но результат не оправданный оказался. А когда отключил рюшки темы, то дизайн стал «говном» :)

    Этот дизайн тоже хорош, согласен насчёт контента.

  • http://belportal.info Dashystik

    а мне тот нравился...все-таки, как женщина, люблю рюшки))))хотя и контент тоже важен)

  • http://belportal.info ProgHat

    Мне этот дизайн намного больше того нравится ;).

  • http://belportal.info Ми

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

  • http://bitby.net WebMast

    Арти, супер... Молодец =). А у меня руки никак не дойдут до блога.

    А вообще, вот по bitby:

    Запросов: 15 | 0.203 Потребление памяти: 3.78MB

    Total loading time: 3.5 seconds

    И это без всяких штук. Единственное что делал, так это захламлял...

    По технологии wedo.in можно ускорить на 430%.

  • http://wwwlab.biz Артур

    @WebMast

    3.5 секунды — на генерацию контента. Есть над чем подумать. Да и посещаемость ведь у тебя под сотню. И сколько плагинов в работе? У меня 35 =)

    @Ми

    Надо сделать переключалку скинов для юзеров :) И тогда все будут счастливы :) Согласен?

    Этот диз простой но функциональный, несмотря на всю свою серость.

  • http://belportal.info ProgHat

    Этот диз простой но функциональный, несмотря на всю свою серость.

    И информативный. Теперь не нужно открывать пост, что бы посмотреть, кто автор.

  • Vic

    Теперь не нужно открывать пост, что бы посмотреть, кто автор.

    кстати да. очень сильно напрягало.

  • vic

    @Артур

    посещалка bitby от 300 уников

  • http://selmarzgroup.ru Павел

    Чем проще тем лучше. Не надо нагружать базу