Depanare PHP - Cum să vă depanați codul PHP (tehnici de depanare Drupal incluse!)

Publicat: 2019-09-03

Depanarea nu este ceva ce noi dezvoltatorii așteptăm cu nerăbdare. Dezvoltatorii detestă erorile, dar pentru a putea construi un software de calitate bună, depanarea este o parte indispensabilă a vieții unui dezvoltator. Fiecare dezvoltator PHP are un stil diferit și metode de utilizare pentru a-și depana codul. Acest lucru depinde de experiența lor, de abordarea lor de rezolvare a problemelor și, cel mai important, de timpul pe care îl au în mână!

Cât de importantă este depanarea și de ce trebuie să vă depanați codul?

Depanarea este o parte integrantă a ciclului de viață al dezvoltării software care asigură rezultate de calitate.
Imaginează-ți asta - Baza de cod este mare, ești nou în proiect, nu ai prea multe detalii despre proiect/funcționalitate. Dar ar trebui să remediați o eroare. De unde începem? Începem prin a analiza codul pas cu pas pentru a înțelege ce se face și unde lucrurile merg prost. Asta, prietenii mei, este Depanare. Depanarea este o artă care se poate îmbunătăți cu practică și experiență.

Cum să depanați codul PHP

Bine, deci iată un caz pe care l-am întâlnit în cariera mea de dezvoltare. Există un site de comerț construit pe Wordpress în care procesul de checkout dura aproximativ 5-8 minute și mi s-a cerut să o rezolv. În acest caz, nu am prea multe cunoștințe despre cum funcționează lucrurile cu Wordpress. Așa că am început cu bifarea opțiunilor din listă una câte una, cum ar fi, (a) Este din cauza unui plugin? (b) Are legătură cu tema? (c) Este vreo bază de cod personalizat? etc.

Instrumentul care m-a ajutat în depanarea php și rezolvarea acestui caz este Blackfire. Acest lucru vă oferă o opțiune mai ușor de citit de utilizator a urmăririi stivei tuturor funcțiilor, timpul necesar pentru fiecare funcție în întregul proces. Folosind aceasta, am găsit funcția care consumă procesul de checkout. Tot ce aveți nevoie este o configurație pentru a adăuga cheia la baza de cod și sunteți gata să analizați orice funcționalitate folosind documentația.
Deci, puteți rezolva erorile dacă aveți cunoștințe despre mai multe metode de depanare PHP.

Tehnici de depanare a codului

Permiteți-mi să vă vorbesc despre câteva tehnici pe care le-am folosit pentru depanarea PHP.
O modalitate simplă și cea mai comună de a verifica dacă funcția sau metoda pe care ați scris-o este apelată, scrieți o ieșire. Nu ar exista niciun dezvoltator care să nu fi folosit asta!
Pentru a verifica valoarea unei variabile, print_r(), var_dump(), var_export(). Bine, să vedem diferența.

Exemplu:

 Să presupunem o matrice 
$a = matrice( 1, matrice( "a", "b"));
print_r($a);

 
Matrice
(
[ 0 ] => 1
[ 1 ] => Matrice
(
[ 0 ] => 'a'
[ 1 ] => 'b'
)
)

Acesta oferă un format care poate fi citit de om și informații despre variabilă. De asemenea, îl putem stoca într-o variabilă cu print_r($var, true).

 var_dump( $a );
 matrice ( 3 ) {
[ 0 ] =>
int( 1 )
[ 1 ] =>
  matrice ( 2 ) {
[ 0 ] =>
șir( 1 ) „a”
[ 1 ] =>
șir ( 1 ) „b”
}
}

Aceasta se imprimă împreună cu tipul, lungimea fiecărei valori. Și acesta este mai rapid comparativ cu print_r()
var_export( $a );

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

Aceasta se imprimă împreună cu tipul, lungimea fiecărei valori. Și acesta este mai rapid comparativ cu print_r()
var_export( $a );

Aceasta returnează un php valid, dacă variabila există, altfel returnează false. Ceea ce înseamnă că rezultatul var_export poate fi folosit direct într-un fișier php.

Ați folosit vreodată debug($var, NULL, TRUE) oferit de core Drupal? Aceasta folosește print_r() sau var_export pe baza argumentelor transmise funcției de depanare php.

Ce zici de avertismentele de mai jos, despre care nu ai idee despre ce linie de cod provoacă un astfel de avertisment.

avertisment: argument nevalid furnizat pentru foreach() în /modules/node/node.module pe linia 485 .

Știm că există atât de multe locuri în care modulul nod va fi apelat. Deci, cum rezolvi asta? O modalitate mai rapidă fără a utiliza alte resurse externe este utilizarea funcției PHP debug_backtrace() . Accesați „drupal_set_message”, pentru că știți, aceasta este metoda care imprimă avertismentul. Pune linia de mai jos, în acea funcție

debug_backtrace();

Ieșire:

Matrice
(
[ 0 ] => Matrice
(
[fișier] => /includes/common.inc
[linia] => 552
[ function ] => drupal_set_message
[ args ] => Matrice
(
[ 0 ] => avertisment: nevalid

argument furnizat pentru foreach() în

/modules/node/node.module pe linia 504.
[ 1 ] => eroare
)

)

[1] => Matrice
(
[fișier] => /modules/node/node.module
[linia] => 504
[funcție] => manipulator de erori
[args] => Matrice
(
[ 0 ] => 2
[ 1 ] => Argument nevalid
furnizat pentru foreach()
[ 2 ] => /module/nod/
nod.modul
[ 3 ] => 504
[ 4 ] => Matrice
(
[param] =>
[revizuire] =>
[resetare] =>
...
)

)

)

[2] => Matrice
(
[fișier] => /sites/all/modules/custom/custom_module
/modul_personalizat.modul
[linie] => 10
[funcție] => node_load
[args] => Matrice
(
[ 0 ] =>
)

)

[3] => Matrice
(
[fișier] => /includes/form.inc
[linia] => 365
[funcție] => custom_module_form_alter
[args] => Matrice
(
...

Această funcție arată stiva tuturor funcțiilor care sunt apelate în procesul de apariție a avertismentului. Asigurați-vă că restricționați limita, altfel PHP afișează un mesaj „memorie epuizată” dacă stiva durează prea mult pentru a fi afișată.

Depanare prin CLI:

Am auzit de phpdbg ! Da, există o extensie php care este disponibilă de la PHP 5.6+ care este folosită pentru a depana un fișier php din linia de comandă.
Deschideți terminalul, introduceți „phpdbg”. Aceasta pornește un shell interactiv de depanare php. Puteți folosi și puncte de întrerupere! Doar încercați-l - modalitatea ascunsă de a depana PHP.
Singura problemă este: va trebui să vă obișnuiți cu comenzile phpdbg pentru a le folosi mai bine.

Depanare prin Drupal:

Devel Kint: Dezvoltatorii Drupal folosesc acest lucru destul de des. Kint este un submodul al modulului Devel care poate fi folosit pentru a depana șabloanele Drupal 8 twig împreună cu dump();

Jurnal DB: Cine nu cunoaște acest modul Drupal?! În D7 este watchdog() și D8 este serviciul de înregistrare.

\Drupal::logger( 'modulul_meu' )->debug($mesaj);

Dar singurul motiv pentru care nu încurajăm utilizarea acestui modul, deși suntem îndrăgostiți de asta, este că mesajul de jurnal este scris în baza de date de fiecare dată!

Și imaginați-vă dacă este o bază de date uriașă, acest lucru ar fi și mai rău și va afecta performanța. Acesta este motivul, nu este recomandat să utilizați modulul DBLOG pe site-urile de producție.
Mai doriți să utilizați DBLog, modul și să reduceți impactul asupra performanței? Există și o soluție pentru asta - DBlog Filter. Acesta este un modul contribuit care ajută la restricționarea tipului de jurnale care urmează să fie scrise în baza de date. De exemplu, dacă doriți să stocați doar jurnalele de severitate „eroare”, le puteți configura cu acest modul. Deci nu trebuie să scapi complet de modulul Dblog . Da, și acest modul este contribuit de mine ;)

Profil web

Web profiler este un modul contribuit furnizat din nou de Devel. După ce ați activat modulul, veți vedea un raport în partea de jos a ferestrei. Ori de câte ori este încărcată o pagină, acest raport ne oferă timpul de încărcare a paginii, numărul de interogări care rulează în pagină, numărul de formulare, numărul de fișiere js/css etc. din pagina respectivă.

profiler web

Da, aceasta oferă chiar și detalii despre fiecare secțiune făcând clic pe ele. De exemplu, următoarea imagine arată interogările din pagina de pornire.

Xdebug

XDebug - Depanare prin IDE:

Cel mai bun și mai ușor de utilizat de a depana majoritatea oamenilor preferă dacă folosesc un IDE pentru codare este utilizarea XDebug. XDebug este o extensie PHP care ajută la dezvoltare și depanare și oferă un depanator cu un singur pas pe care îl puteți utiliza cu un IDE precum PHPStorm. Desigur, pentru a obține cele mai bune rezultate, trebuie să depuneți mai mult efort pentru a instala și configura extensia cu IDE-ul pe care îl utilizați.