Strona główna / blog / Debugowanie aplikacji PHP na serwerze produkcyjnym, z użyciem Xdebug i CLI
Debugowanie aplikacji PHP na serwerze produkcyjnym, z użyciem Xdebug i CLI

Poruszone tematy:

Umiejętność efektywnego debugowania staje się niezbędna dla każdego programisty PHP. Xdebug, potężne narzędzie debugowania dla PHP, oferuje rozwiązania, przewyższające tradycyjne metody, takie jak analiza logów, print_r, var_dump, czy echo, zwłaszcza w kontekście środowisk produkcyjnych. W 2024 roku, znajomość Xdebug i umiejętność jego wykorzystania podkreśla różnicę między dobrym a świetnym programistą PHP.

Co to jest Xdebug?

Xdebug, to narzędzie dla PHP, umożliwiające nie tylko mapowanie przebiegu kodu do generowania raportów pokrycia testami, ale również debugowanie kodu przez zatrzymywanie w określonych punktach, tzw. breakpointach. Dzięki temu, programiści mogą precyzyjnie analizować wartości zmiennych i kontekst wykonywania skryptu, co jest kluczowe dla identyfikacji i rozwiązywania problemów w kodzie.

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

Dlaczego Xdebug przewyższa tradycyjne metody?

Chociaż metody, takie jak print_r, var_dump czy echo mogą być przydatne w rozwiązywaniu codziennych problemów programistycznych, często okazują się niewystarczające w przypadku bardziej złożonych błędów, szczególnie tych występujących asynchronicznie lub wymagających głębszego kontekstu. Xdebug oferuje zdecydowanie bardziej zaawansowane możliwości, takie jak warunkowe zatrzymywanie kodu i szczegółowa analiza zmiennych, co czyni go nieocenionym narzędziem w rękach doświadczonego programisty.

Debugowanie na produkcji z Xdebug

Wyzwaniem może być debugowanie aplikacji w środowisku produkcyjnym, gdzie nie można sobie pozwolić na przerwanie działania aplikacji dla użytkowników. Zazwyczaj w takich przypadkach konieczne jest sklonowanie środowiska produkcyjnego i przetestowanie danego stanu działania aplikacji w izolowanych warunkach, co zazwyczaj jest bardzo skomplikowanym i czasochłonnym procesem. Innym, znacznie szybszym rozwiązaniem jest zdalne debugowanie przy użyciu Xdebug poprzez narzędzie CLI, takie jak dbgpClient, co umożliwia podłączenie się do serwera produkcyjnego bez konieczności bezpośredniego ingerowania w jego działanie.

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

Jak korzystać z dbgpClient?

DbgpClient to oficjalny klient Xdebug dla linii poleceń, który pozwala na bezproblemowe łączenie się z serwerem Xdebug. Wymaga zainstalowanego pluginu Xdebug oraz odpowiedniej konfiguracji, ale dzięki temu umożliwia skuteczne debugowanie aplikacji, w tym ustawianie breakpointów, analizę kontekstu wykonania kodu oraz kontrolę nad jego dalszym przebiegiem.

Analiza i debugowanie w środowisku Dockerowym

Współczesne podejście do wdrażania aplikacji coraz częściej opiera się na konteneryzacji, a Docker stał się standardem w branży. W związku z tym, debugowanie aplikacji w środowisku opartym na Dockerze nabiera nowego wymiaru, umożliwiając symulację środowiska produkcyjnego na serwerze testowym. Przejdźmy do praktycznej analizy na przykładzie prostego kodu PHP, aby zobaczyć, jak Xdebug może wspierać proces rozwiązywania problemów w tak skonfigurowanym środowisku.

Przykładowy kod do analizy

Zakładamy, że nasz serwer testowy działa w konteneryzowanym środowisku Docker. To pozwala na łatwe replikowanie konfiguracji serwera produkcyjnego, co jest kluczowe dla wiarygodnego debugowania. Poniższy prosty fragment kodu PHP będzie przedmiotem naszej analizy:

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

Instalacja dbgpClient w środowisku Docker

Aby zacząć debugowanie z wykorzystaniem Xdebug, kluczowym krokiem jest pobranie i zainstalowanie klienta dbgpClient, który umożliwia interakcję z Xdebug. Pliki wykonywalne dla różnych systemów operacyjnych są dostępne na oficjalnej stronie Xdebug pod adresem: https://xdebug.org/download#dbgpClient.

W kontekście testowania w środowisku opartym na Dockerze, szczególnie zalecana jest wersja dla systemu Linux x86_64. Aby pobrać plik, wykorzystamy narzędzie wget, co jest standardową praktyką w systemach Unixowych. Proces ten jest prosty i szybki, co pozwala na efektywne przygotowanie środowiska do debugowania.

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

wget https://xdebug.org/files/binaries/dbgpClient

Nadaje uprawnienia i przenosze do katalogu bin, tak, żeby był dostępny z każdego miejsca w systemie:

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

chmod +x dbgpClient

mv ./dbgpClient /usr/local/bin/dbgpClient

Sprawdzam czy program działa prawidłowo:

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

Jak widać, program rozpoczął nasłuchiwanie na porcie 9003. Odśwież stronę na której jest aplikacja spodziewaną reakcją powinien być następujący widok:

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

Jeśli kod nie zatrzymuje się i na ekranie wyświetla się komunikat "Waiting for debug server...", prawdopodobnie przyczyną jest brak ponownego załadowania serwera Apache lub problem z konfiguracją Xdebug.

Konfiguracja

Poniżej zamieszczam swoją konfigurację w kontenerze dockerowym

zend_extension=xdebug

xdebug.start_with_request=yes

xdebug.client_port=9003

xdebug.client_host=127.0.0.1

xdebug.mode=develop,debug

xdebug.discover_client_host=1

Zrealizuj z nami swój projekt z zakresu web developmentu.

Debugowanie za pomocą dbgpClient i XDebug

Gdy XDebug jest skonfigurowany prawidłowo, możemy przejść do właściwego procesu debugowania. Kluczowym elementem jest tutaj użycie breakpointów, które umożliwiają zatrzymanie wykonania kodu w wybranym miejscu, co jest nieocenione przy analizie i rozwiązywaniu problemów.

Dodawanie breakpointów

Breakpointy pozwalają na zatrzymanie procesu wykonania programu w wybranym punkcie. Aby ustawić breakpoint w dbgpClient, używamy polecenia:

breakpoint_set -t line -f file:///var/www/html/index.php -n 5

gdzie opcja -f określa plik, a -n linię, na której chcemy zatrzymać wykonanie. W tym przykładzie breakpoint zostanie ustawiony w pliku index.php na linii 5.

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

Breakpointy warunkowe

Możemy również ustawić breakpointy warunkowe, które zatrzymają kod tylko wtedy, gdy spełniony jest określony warunek, np. gdy wartość zmiennej przekroczy pewną liczbę. Używamy do tego polecenia:

breakpoint_set -t line -f file:///var/www/html/index.php -n --base64(expression)

Inne sposoby ustawiania breakpointów

Bardziej szczegółowe i specyficzne przypadki użycia komendy lub komend breakpointowych dostępne są w dokumentacji pod tym linkiem: https://xdebug.org/docs/dbgp#breakpoints

Kontynuowanie programu

Po ustawieniu breakpointu, aby kontynuować wykonanie skryptu, stosujemy polecenie:

run

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

Jeżeli skrypt zatrzymał się na ustawionym breakpointcie, możemy sprawdzić stan zmiennych w danym momencie.

Sprawdzenie kontekstu

Aby zobaczyć wartości zmiennych w miejscu zatrzymania, używamy polecenia context_get

context_get

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

Skrypt zatrzymał się na linii 5, która odpowiada za przypisanie wartości do zmiennej `$pow`. Zauważamy, że wartość tej zmiennej jest oznaczona jako "uninitialized", co oznacza, że nie została jeszcze zainicjowana. Z kolei wartość zmiennej `$sum`, przypisana w linii 3, wynosi 6. Możemy także określić typ zmiennej, co jest szczególnie użyteczne w PHP - języku pozwalającym na dynamiczną zmianę typów zmiennych i ich mieszanie w trakcie wykonania programu.

Inne sposoby użycia

Dodatkowe sposoby użycia dostępne są pod linkiem tutaj: https://xdebug.org/docs/dbgp#context-get

Przejście linię dalej

Istotnym aspektem procesu debugowania jest możliwość krokowego przeglądania kodu - linia po linii - lub wchodzenia do funkcji wywoływanej w programie. Aby to osiągnąć, stosujemy następującą komendę:

step_into

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

Ta komenda albo przesuwa wykonanie do następnej linii kodu, albo zatrzymuje się na początku pierwszej linii funkcji wywołanej w programie. W analizowanym przypadku, zatrzymanie nastąpiło na linii siódmej, gdyż szósta linia nie zawiera kodu.

W tym punkcie jesteśmy w stanie ponownie ocenić kontekst działania programu. Oczekuje się, że nastąpi przypisanie wartości do zmiennej $pow, która powinna osiągnąć wartość 46656.

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

Inne metody kontynuacji programu

DbgpClient posiada również inne metody kontynuacji, które dostępne są w dokumentacji pod tym linkiem: https://xdebug.org/docs/dbgp#continuation-commands

Pobieranie wartości konkretnej zmiennej

Możliwe jest wystąpienie sytuacji, w której w określonej zmiennej przechowywane są obiekty lub tablice. W takim wypadku, funkcja context_get dostarczy nam jedynie podstawowych informacji dotyczących typu obiektu, nie ujawniając jego wartości. Aby uzyskać kompletną informację o zawartości zmiennej, należy zastosować poniższą komendę:

property_get -n $pow

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

W tej sytuacji otrzymano wartość z użyciem context_get, co wynika z faktu, iż analizowana zmienna jest typu prymitywnego. Niemniej jednak, ta komenda okaże się niezwykle przydatna podczas analizowania pól obiektów.

Inne sposoby pobierania wartości zmiennych

Klient posiada również inne metody pobierania zmiennych dokładne ich opisy dostępne są pod tym linkiem: https://xdebug.org/docs/dbgp#property-get-property-set-property-value

Debugowanie aplikacji PHP na serwerze produkcyjnym: Przewodnik

Podsumowanie

Celem tego artykułu było przedstawienie alternatywnego sposobu debugowania kodu produkcyjnego, odbiegającego od tradycyjnych metod, takich jak "print_r", "var_dump" itd., znanych każdemu programiście. DbgpClient okazuje się przydatny również przy debugowaniu lokalnego środowiska pracy, zwłaszcza gdy używamy edytora bez oficjalnie wbudowanego klienta, np. Vim czy Zed.

Rozważenie tego narzędzia staje się szczególnie istotne, gdy nasz program funkcjonuje w środowisku opartym na Dockerze. W takich warunkach, konfiguracja może być wyjątkowo skomplikowana, lecz dbgpClient jest łatwy do zainstalowania na każdej maszynie, nawet działającej w kontenerze Docker.

Metoda debugowania prezentowana w artykule, mimo że może wydawać się na początku skomplikowana, jest znacznie szybsza niż konfigurowanie XDebug w PHPStorm dla kodu uruchomionego w Dockerze. Komendy, które zostały opisane w tym artykule, stanowią podstawowy zestaw narzędzi dostępnych w dokumentacji pod adresem: https://xdebug.org/docs/dbgpClient.

XdebugdbgpClientdebugowanie aplikacji PHPnarzędzie debugowania PHPdebugowanie w środowisku produkcyjnymCLI debugowanie aplikacji PHPskuteczne debugowanie PHPdebugowanie aplikacji w Dockerzezdalne debugowanie PHPpraktyczne analizowanie kodu PHP