WordPress тормозит! Как быстро найти причину?

Хочу поделиться с вами информацией на тему производительности сайта на wordpress. Не всегда бывает просто узнать, почему он внезапно начал тормозить. В общем случае нужно запустить профилирование php чем то наподобие xhprof или xdebug и смотреть, в чем проблема. Но это трудный путь, для того чтобы по нему пройти, необходимы знания и небольшая работа с кодом сайта. Есть путь проще с помощью wp-cli и profile-command.

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Введение

В случае использования wp-cli, специальные знания не нужны. В код wordpress тоже лазить не надо. Нужен будет только консольный доступ к web серверу по ssh. WP-CLI - это по сути набор php скриптов для работы с сайтом на worpdress через командную строку. Многое из того, что вы делаете через админку сайта можно сделать с его помощью. Например, обновить или установить плагин. С помощью wp-cli этот процесс можно заскриптовать и автоматизировать.

В том числе через wp-cli и дополнение к нему profile-command можно выполнить профилирование wordpress и понять, что и как влияет на скорость загрузки и работы сайта. Я впервые познакомился с этим инструментом, когда внезапно у меня начала тормозить админка одного из сайтов на wordpress. Она грузилась по 10-15 секунд и невозможно было понять, с чем именно это связано. С помощью profile-command я смог определить, какой плагин замедлял работу сайта.

Конкретно для подобного случая, когда тормозит админка worpdress из-за какого-то плагина, я и рассмотрю работу с wp-cli/profile-command. Начнем с того, что установим wp-cli на сервер.

Установка wp-cli

Как я уже сказал ранее, wp-cli это просто php скрипт, так что каких-то особенных проблем с его установкой нет. Подключаемся к серверу по ssh и скачиваем исходник:

# cd ~
# curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

Делаем исполняемым и копируем в системную директорию, откуда он будет вызываться.

# chmod +x wp-cli.phar
# mv wp-cli.phar /usr/local/bin/wp

Проверяем, все ли в порядке:

# wp --info

Установка wp-cli

У меня это тестовый web сервер на базе Centos. Я подключился под root. Дальше нам нужно будет все делать от имени пользователя, под которым работает web сервер. В моем случае это стандартный пользователь nginx. Проверим работу под ним.

# sudo -u nginx wp --info
sudo: wp: command not found

Для этого пользователя не прописан path=/usr/local/bin, поэтому надо писать полный путь к скрипту.

# sudo -u nginx /usr/local/bin/wp --info

Проверка wp-cli на wordpress

Теперь выполним установку пакета profile-command.

# sudo -u nginx /usr/local/bin/wp package install git@github.com:wp-cli/profile-command.git

Если у вас по-умолчанию для работы php скрипта выделяется менее 256мб памяти, то скорее всего получите ошибку:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 9437184 bytes) in phar:///usr/local/bin/wp/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php on line 588
Reverted composer.json.
WP-CLI ran out of memory. Please see https://bit.ly/wpclimem for further help.

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

# sudo -u nginx php -d memory_limit=512M /usr/local/bin/wp package install git@github.com:wp-cli/profile-command.git

Wp-cli хранит все настройки и пакеты в домашней директории пользователя, в папке .wp-cli. У пользователя должны быть права на ее создание. В моем случае пользователь nginx имеет домашнюю директорию /var/cache/nginx, в которую у него нет прав на запись. В итоге, папку .wp-cli я создал вручную и назначил ей права пользователя nginx.

# mkdir /var/cache/nginx
# chown -R nginx. /var/cache/nginx
# chmod -R 0700 /var/cache/nginx

После этого установка модуля прошла без ошибок. По сути, были просто скачаны его исходники в директорию /var/cache/nginx/.wp-cli/packages/vendor/wp-cli/profile-command.

У нас все готово для профилирования wordpress, чтобы понять, из-за чего он может тормозить. Давайте разберем, как это сделать.

Смотрим, из-за чего тормозит wordpress

Запускаем профилировщик, указывая ему путь к директории с сайтом wordpress.

# sudo -u nginx /usr/local/bin/wp profile stage --path=/web/sites/serveradmin.ru/www

Проверяем время загрузки wordpress по этапам

Так как это скрипт php, вы получите в консоли информацию и предупреждения от него. На них можно не обращать внимание, если это не ошибки.

Мы видим 3 этапа загрузки wordpress с указанием затраченного времени на каждый этап. Что они значат:

  1. bootstrap - по сути это сам wordpress и есть. Тут загружаются плагины, темы и хуки движка.
  2. main_query - формирование на основе запроса страницы основного класса worpdress - WP_Query.
  3. termplate - здесь wordpress на основе данных из wp_query определяет тему и рендерит вывод.

Можно выбирать набор столбцов для вывода. Например, можно оставить только название этапа, время выполнения и использование кэша.

# sudo -u nginx /usr/local/bin/wp profile stage --fields=stage,time,cache_ratio --path=/web/sites/serveradmin.ru/www

Фильтр по столбцам

Двигаемся дальше. Нас интересует информация о плагинах, чтобы понять, кто из них тормозит. Для этого подробнее смотрим на этап bootstrap.

# sudo -u nginx /usr/local/bin/wp profile stage bootstrap --path=/web/sites/serveradmin.ru/www

Профилирование wordpress

Видим список хуков. Смотрим информацию по хукам plugins_loaded и init.

# sudo -u nginx /usr/local/bin/wp profile hook plugins_loaded --fields=callback,location,time,cache_ratio,request_time --path=/web/sites/serveradmin.ru/www

Какой плагин тормозит в wordpress

Если какой-то плагин wordpress тормозит, вы увидите это в таблице. В моем случае явного аутсайдера нет, так как на сайте все в порядке. Иногда бывает так, что какой-то плагин вообще ломает работу сайта так, что даже профайлер не работает. Можно исключить этот плагин из работы и протестировать скорость запуска wordpress без него. Делается это так.

# sudo -u nginx /usr/local/bin/wp profile hook plugins_loaded --fields=callback,location,time,cache_ratio,request_time --path=/web/sites/serveradmin.ru/www --skip-plugins=wpforo

Можно сразу отсортировать вывод по определенным столбцам. Например, по времени исполнения.

# sudo -u nginx /usr/local/bin/wp profile hook init --fields=callback,location,time,cache_ratio,request_time --path=/web/sites/serveradmin.ru/www --orderby=time --order=DESC

Список всех плагинов со временем загрузки каждого

И так далее. Тут можно детально разобрать производительность wordpress и понять, из-за чего он тормозит.

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Вот таким простым способом можно выяснить, из-за чего тормозит WordPress. При чем вам не нужно ничего устанавливать на сервер, кроме дополнительных php скриптов. В сам код сайта тоже лазить не надо. Простые ситуации очень быстро и просто решаются с помощью wp-cli.  С помощью него можно быстро выяснить, из-за какого плагина не работает сайт. Обычно я иду в директорию /wp-content/plugins и начинаю по очереди отключать плагины, переименовывая директории. С помощью wp-cli/profile-command это сделать проще и быстрее.

Не забывайте, что сайт может тормозить не только из-за внутренних проблем движка, но и других. Вот инструмент для выявления проблем - webpagetest, а вот пример аудита быстродействия сайт - Оптимизация скорости сайта, аудит сайта.

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Подписывайся на telegram канал автора

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

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

5 комментариев

  1. Михаил

    У меня не завелось
    Скрипт говорит
    Error: Ошибка установки соединения с базой данных.
    OS Ubuntu 20.04
    Вместо юзера nginx (его у меня нет) работаю от юзера www
    в принципе все до начала тестов он проходит, но как пытаюсь поработать с вордпрессом падает с ошибкой которая выше, куда копнуть?

    • Какой скрипт это говорит? В ошибке точно указано, в чём проблема.

      • Михаил

        Ну wp-cli по вашей статье
        запускаю его
        root@virt-777:~# sudo -u www /usr/local/bin/wp profile stage --path=/www/wwwroot/sitename.ru/
        Error: Ошибка установки соединения с базой данных.
        На этом собственно и все :)))

  2. Спасибо большое, пробую внедрить так сказать у себя на сайте и по итогу напишу более развернутый отзыв и коммент. Спасибо!!!

  3. От души. Благодарю. Даже и не подозревал, что есть такая чудесная штука, и я всё делал по старинке через var_dump();

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar