23 wrz

WordPress wolno działa! Jak szybko znaleźć przyczynę ?

czemu-wordpress-dziala-wolno

Jak przyspieszyć działanie strony na WordPress? Dlaczego WordPress wolno się ładuje? Jaka wtyczka spowodowała wolne ładowania strony?
W tym artykule odpowiemy na powyższe pytania, jak przy pomocy wp-cli oraz profile-command zamiast standardowego profilowania php czymś skomplikowanym na kształt xhprof lub xdebug można wyjaśnić w czym jest problem wolnego działania strony na WordPress.

Co to jest WP-CLI: interfejs do zarządzania WordPress w konsoli?

Przy korzystaniu z wp-cli nie jest wymagana specjalna wiedza lub zaawansowane umiejętności programistyczne, nawet nie musimy nic zmieniać w kodzie źródłowym WordPress. Jedynie wymagany będzie dostęp do konsoli serwera poprzez SSH. WP-CLI – jest zestawem skryptów php do pracy ze stroną worpdress przez konsolę. Większość rzeczy dostępnych w panelu administracyjnym strony można zrobić za pomocą właśnie wp-cli. Na przykład, zaktualizować lub zainstalować wtyczkę, lub zautomatyzować to działanie skryptem.

W tym poprzez wp-cli oraz rozszerzenia profile-command można wykonać profilowanie WordPress i zrozumieć, co wpływa na szybkość ładowania i działania strony. Przy pomocy profile-command jesteśmy w stanie znaleźć przyczynę/wtyczkę, która może zwalniać również ładowanie panelu admin o kilkanaście sekund.

Polecamy hosting WordPress, który maksymalnie zoptymalizowany do wydajnego działania stron na WordPress już za 159 zł/rok brutto! Z kodem RABATNABLOG dostaniesz dodatkowy rabat 15%

Zacznijmy od tego, że zainstalujemy wp-cli na serwerze.

Jak obsługiwać WP-CLI?

Instalacja wp-cli

Wp-cli jest po prostu skryptem php i żadnych problemów z jego instalacją nie powinno powstać. Logujemy się na serwer przez SSH i pobieramy paczkę:

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

Zmieniamy uprawnienia i kopiujemy do folderu systemowego, z którego zostanie wywoływany.

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

Sprawdzamy czy wszystko jest ok:

wp --info

 

wp-info

W naszym przypadku testowy serwer jest oparty o Ubuntu, połączyliśmy się do niego pod root`em. Następnie wszystko trzeba będzie robić w imieniu użytkownika, przez którego działa serwer www z odpowiednimi uprawnieniami. W naszym przypadku jest to standardowy użytkownik nginx.

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

Dla tego użytkownika nie jest zarejestrowana ścieżka path=/usr/local/bin, więc musimy podać pełną ścieżkę do skryptu.

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

nginx-wp-info

Instalacja pakietu Profile-command

Teraz wykonamy instalację rozszerzenia profile-command.

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

Jeżeli do wykonania skryptów php  jest przydzielono mniej niż 256mb pamięci RAM, to najprawdopodobniej otrzymamy błąd:

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
Powracali composer.json.
WP-CLI ran out of memory. Please see https://bit.ly/wpclimem for further help.

Aby szybko to naprawić nie wchodząc do ustawień php, wystarczy uruchomić instalację pakietu z dodatkowym parametrem zwiększającym pamięć.

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

Wp-cli przechowuje wszystkie ustawienia i dodatki w katalogu domowym użytkownika, w folderze .wp-cli. Użytkownik musi mieć uprawnienia na tworzenie takiego folderu. W przypadku użytkownika nginx katalog główny użytkownika jest /var/cache/nginx, w której on nie ma uprawnień do zapisu. Folder .wp-cli stworzyliśmy ręcznie i zmieniliśmy uprawnienia dla użytkownika nginx.

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

Po tym instalacja modułu odbyła się bez problemów. Tak na prawdę, były po prostu pobierane źródła do  katalogu /var/cache/nginx/.wp-cli/packages/vendor/wp-cli/profile-command.

W tym momencie mamy już wszystko gotowe do profilowania wordpress, aby zrozumieć, co może zwalniać jego działanie.

Sprawdzamy, co spowalnia WordPress

Uruchamiamy profiler, wskazując ścieżkę do katalogu ze stroną wordpress.

sudo -u nginx /usr/local/bin/wp profile stage --path=/www/sites/strona.pl/public_html

profile-wp-cli

Ponieważ jest to skrypt php otrzymamy w konsoli informacje i ostrzeżenia. Można na nich nie zwracać uwagi, jeśli to nie jest błąd.

Widzimy 3 etapy uruchamiania wordpress z podaniem czasu każdego etapu. Etapy oznaczają:

  1. bootstrap – w zasadzie to właśnie sam wordpress. Tu są pobierane wtyczki, motywy i hooky silnika.
  2. main_query – tworzenie głównej klasy worpdress – WP_Query na podstawie żądanej strony.
  3. template – tu wordpress na podstawie danych z wp_query wyznacza motyw i generuje stronę.

Można wybrać jakie kolumny mają być wyświetlane. Na przykład, można zostawić tylko nazwa etapu, czas wykonania i wykorzystanie pamięci podręcznej.

sudo -u nginx /usr/local/bin/wp profile stage --fields=stage,time,cache_ratio --path=/www/sites/strona.pl/public_html

 

stage-wp-cli

Interesują nas informacje o wtyczkach, aby zrozumieć, która z nich zwalnia działanie strony. Aby to przeanalizować – patrzymy na etap bootstrap.

sudo -u nginx /usr/local/bin/wp profile stage bootstrap --path=/www/sites/strona.pl/public_html

wp-cli-plugins-loaded

Widzimy listę hook`ów. Sprawdzamy informacje z plugins_loaded oraz init.

sudo -u nginx /usr/local/bin/wp profile hook plugins_loaded --fields=callback,location,time,cache_ratio,request_time --path=/www/sites/strona.pl/public_html

wp-cli-plugins-czas

Jeżeli któraś z wtyczek zwalnia wordpress – zobaczymy to w tabeli. W naszym przypadku nie widać takiej, ponieważ na stronie jest wszystko w porządku. Czasami może wydarzyć się tak, że jakaś wtyczka wywołuje takie błędy na stronie, że nawet profiler nie działa. Można wyłączyć tą wtyczkę i przetestować szybkość uruchamiania wordpress bez niej. Można to zrobić w następny sposób:

sudo -u nginx /usr/local/bin/wp profile hook plugins_loaded --fields=callback,location,time,cache_ratio,request_time --path=/www/sites/strona.pl/public_html --skip-plugins=wpforo

Można również posortować wyniki według pewnych kolumn. Na przykład, po czasie wykonania.

sudo -u nginx /usr/local/bin/wp profile hook init --fields=callback,location,time,cache_ratio,request_time --path=/www/sites/strona.pl/public_html --orderby=time --order=DESC

wp-cli-plugins-czas-sort

Przy pomocy tych danych można przeanalizować wydajność WordPress i zrozumieć czemu strona działa wolniej, niż powinna.

Zamiast podsumowania

Jeżeli coś przeoczyliśmy lub jest jeszcze łatwiejszy sposób na identyfikacje zwalniającej stronę wtyczki – zapraszamy do komentowania i propozycji poniżej :)

Oczywiście polecamy hosting dla wordpress od Hostovita (od 159 zł brutto rocznie), który w pełni obsługuje takie rozszerzenia jak wp-cli oraz zarządzenie hostingiem poprzez konsole SSH serwera współdzielonego.

W taki prosty sposób można dowiedzieć się, co zwalnia WordPress. Przy czym nie trzeba nic instalować na serwer, oprócz dodatkowych skryptów php. Do kodu strony też nie musimy zaglądać. Dzięki wp-cli można szybko dowiedzieć się, przez jaką wtyczkę nie działa strona internetowa.