Хочу поделиться с вами информацией на тему производительности сайта на wordpress. Не всегда бывает просто узнать, почему он внезапно начал тормозить. В общем случае нужно запустить профилирование php чем то наподобие xhprof или xdebug и смотреть, в чем проблема. Но это трудный путь, для того чтобы по нему пройти, необходимы знания и небольшая работа с кодом сайта. Есть путь проще с помощью wp-cli и profile-command.
Научиться настраивать 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
У меня это тестовый 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
Теперь выполним установку пакета 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
Так как это скрипт php, вы получите в консоли информацию и предупреждения от него. На них можно не обращать внимание, если это не ошибки.
Мы видим 3 этапа загрузки wordpress с указанием затраченного времени на каждый этап. Что они значат:
- bootstrap - по сути это сам wordpress и есть. Тут загружаются плагины, темы и хуки движка.
- main_query - формирование на основе запроса страницы основного класса worpdress - WP_Query.
- 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
Видим список хуков. Смотрим информацию по хукам 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 без него. Делается это так.
# 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, а вот пример аудита быстродействия сайт - Оптимизация скорости сайта, аудит сайта.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
У меня не завелось
Скрипт говорит
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: Ошибка установки соединения с базой данных.
На этом собственно и все :)))
Спасибо большое, пробую внедрить так сказать у себя на сайте и по итогу напишу более развернутый отзыв и коммент. Спасибо!!!
От души. Благодарю. Даже и не подозревал, что есть такая чудесная штука, и я всё делал по старинке через var_dump();