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.
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
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
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
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ą:
- bootstrap – w zasadzie to właśnie sam wordpress. Tu są pobierane wtyczki, motywy i hooky silnika.
- main_query – tworzenie głównej klasy worpdress – WP_Query na podstawie żądanej strony.
- 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
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
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
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
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.