Podczas swojej pracy wielokrotnie spotykałem się z sytuacją, iż aplikacja działała nie tak szybko, jak się tego oczekiwało. Powody takich sytuacji były różne i w dużej mierze zależały od projektu. Jedne wynikały ze źle zaprojektowanej aplikacji, która wraz ze wzrostem zaczynała działać wolniej. Inne wynikały ze zwiększonego ruchu. A jeszcze inne były po prostu z efektem wieloletnich zaniedbań. Poniżej zamieściłem listę 5 narzędzi, z których najczęściej korzystam, aby w łatwy sposób znaleźć miejsca, które niekorzystnie wpływają na wydajność.
Slow query log
Podczas problemów z wydajnością bazy danych zwykle włączam slow query loga. Jest to narzędzie bazy MySQL, które umożliwia logowanie do pliku zapytań, na podstawie różnych kryteriów. Możemy logować te zapytania, które wykonują się dłużej niż określony czas i te, które nie używają indeksów. Pozwoli to znaleźć problematyczne zapytania, przyjrzeć się im dokładniej i spróbować zoptymalizować.
Explain
Gdy mamy już listę problematycznych zapytań, warto sprawdzić, w jaki sposób są one wykonywane przez bazę danych. Do tego celu idealnie nada się funkcja EXPLAIN. Działa ona z zapytaniami typu SELECT, DELETE, INSERT, REPLACE, i UPDATE. W przypadku zapytania SELECT funkcja wyświetli informacje z optymalizatora o planie jego wykonania. dzięki tej funkcji możesz sprawdzić, gdzie należy dodać indeks, aby dane wyszukiwały się szybciej. Co więcej, możesz także sprawdzić, czy optymalizator łączy tabele w odpowiedniej kolejności
Xdebug
Jest to jedno z podstawowych narzędzi, z których korzystam podczas programowania. Debugowanie kodu z nim kodu jest bardzo proste i sprawdza się podczas pracy nad każdą aplikacją, a zwłaszcza tymi bardzo złożonymi. Możemy dzięki niemu wstawić odpowiednie breakpointy w kodzie i przejść cały program krok po kroku.
Xdebug posiada też opcję profilowania. Jest to narzędzie pozwalające wizualizować przebieg całego żądania. Zapisuje ono dane do pliku, który możemy otworzyć dzięki np. programu KCacheGrind (Linux). Widać na nim wywołania poszczególnych komponentów czy czas wykonywania, co ułatwia analizę i pozwala na wyłapanie wąskich gardeł.
Innym, płatnym narzędziem, umożliwiającym profilowanie jest BlackFire.io. Jedną z jego zalet jest możliwość profilowania kodu na produkcji, ponieważ narzut jest znikomy i nie ma większego wpływu na wydajność.
Web Debug Toolbar & Profiler
Najczęściej zdarza mi się pracować nad aplikacjami opartymi na frameworku Symfony. Możemy w nich zainstalować Web Debug Toolbar. Jest to pasek developerski, który pojawia się na dole strony i pokazuje podstawowe informacje o żądaniu. Możemy tam znaleźć dane o wersji php, włączonych dodatkach, czasie ładowania strony, informacji o wykonanej akcji kontrolera i wiele więcej. Po kliknięciu w dowolną ikonę zostaniemy przeniesieni do widoku Profilera.
W Profilerze możemy podejrzeć takie rzeczy, jak to ile czasu wykonywał się request i poszczególne komponenty aplikacji. Są tam informacje o logach, wyjątkach, cache'u, eventach, routingach. W zakładce Twig znajduje się lista wygenerowanych szablonów. Znajdziemy tam także listę wykonanych zapytań do bazy danych, które można sortować i grupować. Jest to niezwykle przydatne narzędzie w codziennej pracy.
Statyczna Analiza Kodu
PhpStorm umożliwia instalowanie różnych dodatków, które będą informowały nas o tym, iż robimy coś nie tak, albo, iż można zrobić coś lepiej.
Jednym z takich dodatków jest PHP Inspections. Analizuje on kod i podkreśla go, gdy znajdzie jakiś problem. Wykrywa powielony kod, problemy z kompatybilnością. Potrafi zoptymalizować instrukcje warunkowe "if", poprzez zamianę warunków kolejnością, aby wykonywały się szybciej lub poprzez usunięcie zbędnych warunków. Znajduje problemy z wydajnością, takie jak np. mergowanie tablicy w pętli. Wykrywa problemy z bezpieczeństwem i wiele innych.
PhpStorm umożliwia integrację także z innymi narzędziami do statycznej analizy kodu, takimi tak Psalm, PHPStan, PHP CS Fixer, Mess Detector czy PHP_CodeSniffer.
Podsumowanie
Wolno działające aplikacje, to problem, z którym spotyka się większość programistów. Aby skutecznie namierzyć miejsca, które wymagają poprawy, często wymagane jest skorzystanie z dodatkowych narzędzi. Powyższa lista z pewnością pomoże je znaleźć, a w niektórych przypadkach także wyeliminować, aby nasze programy działały szybciej i zużywały mniej zasobów.