Debugowanie PHP — jak debugować kod PHP (w tym techniki debugowania Drupala!)

Opublikowany: 2019-09-03

Debugowanie nie jest czymś, na co my, deweloperzy, czekamy. Programiści nie znoszą błędów, ale aby móc zbudować oprogramowanie dobrej jakości, debugowanie jest nieodzowną częścią życia programisty. Każdy programista PHP ma inny styl i inne metody debugowania swojego kodu. Zależy to od ich doświadczenia, podejścia do rozwiązywania problemów, a co najważniejsze - ilości czasu, którą mają pod ręką!

Jak ważne jest debugowanie i dlaczego musisz debugować swój kod?

Debugowanie jest integralną częścią cyklu życia oprogramowania, która zapewnia wyniki wysokiej jakości.
Wyobraź to sobie - baza kodu jest duża, jesteś nowy w projekcie, nie masz zbyt wielu szczegółów dotyczących projektu/funkcjonalności. Ale powinieneś naprawić błąd. Od czego zaczynamy? Zaczynamy od analizy kodu krok po kroku, aby zrozumieć, co zostało zrobione i gdzie coś idzie nie tak. To, moi przyjaciele, jest debugowaniem. Debugowanie to sztuka, która może stać się lepsza dzięki praktyce i doświadczeniu.

Jak debugować kod PHP

Ok, więc oto przypadek, na który natknąłem się w swojej karierze deweloperskiej. Istnieje witryna komercyjna zbudowana na Wordpressie, w której proces kasy trwał około 5-8 minut i zostałem poproszony o rozwiązanie tego problemu. W tym przypadku nie mam zbyt wiele wiedzy na temat działania Wordpressa. Zacząłem więc od zaznaczania kolejno opcji z listy, takich jak: (a) Czy to z powodu jakiejś wtyczki? (b) Czy jest to związane z motywem? (c) Czy jest to jakakolwiek podstawa niestandardowego kodu? itp.

Narzędziem, które pomogło mi w debugowaniu php i rozwiązaniu tej sprawy, jest Blackfire. Daje to bardziej czytelną dla użytkownika opcję śledzenia stosu wszystkich funkcji, czasu potrzebnego na każdą funkcję w całym procesie. Korzystając z tego, znalazłem funkcję, która pochłania proces kasowania. Wszystko czego potrzebujesz to trochę konfiguracji, aby dodać klucz do bazy kodu i jesteś gotowy do analizy dowolnej funkcjonalności przy użyciu dokumentacji.
Możesz więc rozwiązać błędy, jeśli masz wiedzę na temat wielu metod debugowania PHP.

Techniki debugowania kodu

Pozwólcie, że opowiem o kilku technikach, których użyłem do debugowania PHP.
Najprostszym i najczęstszym sposobem sprawdzenia, czy funkcja lub napisana przez Ciebie metoda jest wywoływana, jest napisanie wyjścia. Nie byłoby żadnego programisty, który by tego nie używał!
Aby sprawdzić wartość jakiejś zmiennej, print_r(), var_dump(), var_export(). Dobra, zobaczmy różnicę.

Przykład:

 Załóż tablicę 
$a = array( 1, array( "a", "b") );
print_r($a);

 
Szyk
(
[ 0 ] => 1
[ 1 ] => Tablica
(
[ 0 ] => 'a'
[ 1 ] => 'b'
)
)

Daje to czytelny dla człowieka format i informacje o zmiennej. Możemy również zapisać go do zmiennej z print_r($var, true).

 var_dump( $a );
 tablica ( 3 ) {
[ 0 ]=>
wewn.( 1 )
[ 1 ]=>
  tablica ( 2 ) {
[ 0 ]=>
ciąg( 1 ) "a"
[ 1 ]=>
ciąg( 1 ) "b"
}
}

To drukuje wraz z typem, długością każdej wartości. A to jest szybsze w porównaniu do print_r()
var_export( $a );

 tablica (
  0 => 1 ,
  1 =>
  tablica (
    0 => 'a' ,
    1 => 'b' ,
),
)

To drukuje wraz z typem, długością każdej wartości. A to jest szybsze w porównaniu do print_r()
var_export( $a );

To zwraca poprawny php, jeśli zmienna istnieje, w przeciwnym razie zwraca false. Oznacza to, że dane wyjściowe var_export można wykorzystać bezpośrednio w pliku php.

Czy kiedykolwiek korzystałeś z debug($var, NULL, TRUE) dostarczanego przez rdzeń Drupala? Używa print_r() lub var_export w oparciu o argumenty przekazane do funkcji debugowania PHP.

A co z ostrzeżeniami jak poniżej, których nie masz pojęcia, która linia kodu powoduje takie ostrzeżenie.

ostrzeżenie: Nieprawidłowy argument podany dla foreach() w /modules/node/node.module w wierszu 485 .

Wiemy, że jest tak wiele miejsc, w których moduł node zostanie wywołany. Jak więc to rozwiązać? Szybszym sposobem bez korzystania z innych zasobów zewnętrznych jest użycie funkcji PHP debug_backtrace() . Przejdź do „drupal_set_message”, ponieważ wiesz, to jest metoda, która wyświetla ostrzeżenie. Umieść poniższy wiersz w tej funkcji

debug_backtrace();

Wyjście:

Szyk
(
[ 0 ] => Tablica
(
[plik] => /zawiera/wspólne.inc
[linia] => 552
[ funkcja ] => drupal_set_message
[ argumenty ] => Tablica
(
[ 0 ] => ostrzeżenie: nieważne

argument dostarczony dla foreach() w

/modules/node/node.module w wierszu 504.
[ 1 ] => błąd
)

)

[1] => Tablica
(
[plik] => /moduły/węzeł/węzeł.moduł
[linia] => 504
[funkcja] => obsługa_błędu
[argumenty] => Tablica
(
[ 0 ] => 2
[ 1 ] => Nieprawidłowy argument
dostarczone dla foreach()
[ 2 ] => /moduły/węzeł/
node.moduł
[ 3 ] => 504
[ 4 ] => Tablica
(
[parametr] =>
[wersja] =>
[resetuj] =>
...
)

)

)

[2] => Tablica
(
[plik] => /sites/all/modules/custom/custom_module
/moduł_niestandardowy.moduł
[linia] => 10
[funkcja] => obciążenie_węzła
[argumenty] => Tablica
(
[ 0 ] =>
)

)

[3] => Tablica
(
[plik] => /zawiera/form.inc
[linia] => 365
[funkcja] => custom_module_form_alter
[argumenty] => Tablica
(
...

Ta funkcja pokazuje stos wszystkich funkcji, które są wywoływane w procesie wywoływania ostrzeżenia. Upewnij się, że ograniczasz limit, w przeciwnym razie PHP wyświetli komunikat „pamięć wyczerpana”, jeśli wyświetlenie stosu trwa zbyt długo.

Debugowanie przez CLI:

Słyszałem o phpdbg ! Tak, istnieje rozszerzenie php dostępne w PHP 5.6+, które służy do debugowania pliku php z wiersza poleceń.
Otwórz terminal, wpisz „phpdbg”. To uruchamia interaktywną powłokę debugera PHP. Możesz także użyć punktów przerwania! Po prostu wypróbuj - ukryty sposób debugowania PHP.
Jedynym problemem jest to, że będziesz musiał przyzwyczaić się do poleceń phpdbg, aby lepiej z niego korzystać.

Debugowanie przez Drupala:

Devel Kint: Deweloperzy Drupala używają tego dość często. Kint to podmoduł modułu Devel, który może być używany do debugowania szablonów gałązek Drupal 8 wraz z dump();

DB Log: Kto nie wie o tym module Drupala?! W D7 jest to watchdog(), a D8 jest to usługa loggera.

\Drupal::logger( 'mój_moduł' )->debug($wiadomość);

Ale jedynym powodem, dla którego nie zachęcamy do korzystania z tego modułu, mimo że jesteśmy w nim zakochani, jest to, że wiadomość z logiem jest za każdym razem zapisywana w bazie danych!

I wyobraź sobie, że jeśli jest to ogromna baza danych, byłoby to jeszcze gorsze i wpłynie na wydajność. Z tego powodu nie zaleca się używania modułu DBLOG na stronach produkcyjnych.
Czy nadal chcesz używać DBLog, modułu i zmniejszać wpływ na wydajność? Na to też jest rozwiązanie - DBlog Filter. Jest to dodatkowy moduł, który pomaga w ograniczaniu rodzaju logów, które mają być zapisywane w bazie danych. Na przykład, jeśli chcesz przechowywać tylko logi o wadze „błąd”, możesz je skonfigurować za pomocą tego modułu. Nie musisz więc całkowicie pozbywać się modułu Dblog . O tak, a ten moduł jest moim wkładem ;)

Profiler internetowy

Profiler sieciowy jest ponownie dodanym modułem dostarczonym przez Devel. Po włączeniu modułu na dole okna pojawi się raport. Za każdym razem, gdy strona jest ładowana, raport ten podaje nam czas ładowania strony, liczbę zapytań uruchomionych na stronie, liczbę formularzy, liczbę plików js/css itp. na tej stronie.

profiler internetowy

Tak, to oferuje nawet szczegóły każdej sekcji, klikając je. Na przykład poniższy obraz przedstawia zapytania na stronie głównej.

Xdebug

XDebug - Debugowanie przez IDE:

Najlepszym i bardziej przyjaznym dla użytkownika sposobem debugowania, który większość ludzi preferuje, jeśli używają IDE do kodowania, jest użycie XDebug. XDebug to rozszerzenie PHP, które pomaga w rozwoju i debugowaniu oraz zapewnia debugger jednoetapowy, którego można używać z IDE, takim jak PHPStorm. Oczywiście, aby uzyskać najlepsze wyniki, musisz włożyć więcej wysiłku w zainstalowanie i skonfigurowanie rozszerzenia z używanym IDE.