Xdebug - Debugging profesional PHP

Agenda noastră

  1. Introducere în subiect.
  2. Descărcarea și instalarea aplicației Xdebug pe mașina dvs. locală (Mac OS X 10.6.6+, MAMP 2.1.1).
  3. Integrarea cu PhpStorm.
  4. Practicați depanarea.

Ce vei avea nevoie

  • Un Mac care rulează Mac OS X 10.6.6+.
    • Dacă sunteți pe 10.8.X tu Mai trebuie să instalați XQuartz ca Apple eliminat X11.
    • Dacă sunteți pe Windows, întregul proces este oarecum mai ușor, doar loviți Google pentru mai multe detalii.
  • Apple Xcode 4.6 (gratuit pe Mac App Store).
    • Instrumente pentru linia de comandă.
  • homebrew.
  • O aplicație terminală la alegere.
  • PhpStorm 5+ (multe alte IDE-uri vor funcționa și ele).

Ce este Xdebug?

Ei bine, din punct de vedere tehnic, Xdebug este o extensie pentru PHP pentru a vă ușura viața în timpul depanării codului. În acest moment, puteți fi folosit pentru depanarea codului dvs. cu diverse alte soluții simple. Acestea includ utilizarea ecou declarații la diferite stări din cadrul programului dvs. pentru a afla dacă cererea dumneavoastră trece o condiție sau pentru a obține valoarea unei anumite variabile. În plus, este posibil să utilizați adesea funcții cum ar fi var_dump, print_r sau altele pentru a inspecta obiectele și tablourile.

Ceea ce întâlnesc adesea sunt câteva funcții de ajutor, cum ar fi:

funcția dump (valoarea $) echo '
„; var_dump (valoare $); echo "
„;

Adevărul este că am făcut și eu acest lucru de foarte mult timp.

Adevărul este că am făcut și eu acest lucru de foarte mult timp. Și ce e în neregulă cu asta? Din punct de vedere tehnic, nu este nimic în neregulă cu ea. Funcționează și face ceea ce ar trebui să facă.

Dar imaginați-vă pentru o clipă, pe măsură ce aplicațiile dvs. evoluează, ați putea obișnui să vă stropiți codul peste tot cu mici ecouri, var_dumps și debugeri personalizați. Acum, acest lucru nu este obstructiv în timpul fluxului dvs. de testare, dar dacă uitați să curățați unele dintre codurile de depanare înainte de a merge la producție? Acest lucru poate provoca unele probleme destul de înfricoșătoare, deoarece acei debuggeri minuscuți ar putea chiar să-și găsească drumul în controlul versiunilor și să rămână acolo pentru o lungă perioadă de timp.

Următoarea întrebare este: cum depanezi în producție? Din nou, imaginați-vă că navigați prin unul dintre serviciile dvs. web preferate și dintr-o dată obțineți o listă mare de informații de depanare prezentate pe ecran. Acum, desigur, poate să dispară după reîmprospătarea browserului, dar nu este o experiență foarte bună pentru utilizatorul site-ului.

În cele din urmă, v-ați dorit vreodată să puteți trece prin codul dvs., linia de linie, să vedeți expresii și chiar să introduceți un apel pentru a vedea de ce produce o valoare de returnare greșită?

Ei bine, trebuie să vă grăbiți cu adevărat în lumea depanării profesionale Xdebug, deoarece poate rezolva toate problemele de mai sus.


Configurarea MAMP

Nu vreau să merg prea mult în procesul de descărcare și instalare a MAMP pe un Mac. În schimb, vă voi împărtăși că folosesc PHP 5.4.4 și standardul Apache Port (80) pe parcursul acestei citiri.


Prima decizie

O notă rapidă înainte de a începe să construim propria noastră Xdebug prin Homebrew: Dacă doriți să luați cel mai ușor traseu, MAMP deja vine cu Xdebug 2.2.0. Pentru ao activa, deschideți:

/Applications/MAMP/bin/php/php5.4.4/conf/php.ini

cu un editor de text la alegere, mergeți la partea de jos și dezarhivați ultima linie eliminând ;.

Ultimele două rânduri ale fișierului trebuie citite astfel:

[xdebug] zend_extension = "/ Aplicații / MAMP / bin / php / php5.4.4 / lib / php / extensii / no-debug-non-zts-20100525 / xdebug.so"

Acum, dacă vă întrebați:

"De ce aș vrea să aleg o cale mai grea decât asta?"

Și răspunsul meu la asta este că nu este niciodată o greșeală să te uiți dincolo de jantă și să înveți ceva nou. Mai ales ca dezvoltator in aceste zile, aruncarea unui ochi pe chestii legate de server va fi mereu la indemana la un moment dat. Promisă.


Instalați Xcode și Instrumente linie de comandă

Puteți obține Apple Xcode gratuit de pe Mac App Store. După ce ați descărcat-o, accesați preferințele aplicației, apăsați pe „Descărcări“ și instalați "Instrumente Linie de comandă" din listă.


Instalați Homebrew

Homebrew este un manager de pachete îngrijorat pentru Mac OS X, care vă oferă toate lucrurile pe care Apple le-a lăsat afară. Pentru a instala Homebrew, trebuie doar să lipiți următoarea comandă în terminalul dvs..

ruby -e "$ (curl -fsSkL raw.github.com/mxcl/homebrew/go)"

Pe un Mac, Homebrew va fi cel mai convenabil mod de a instala Xdebug. Cu toate acestea, pe Linux, compilarea dvs. este cel mai bun mod de a merge; care nu este atât de ușor pe un Mac.

Sfat: utilizatorii Windows trebuie doar să descarce * .dll fișier de la Xdebug.org, puneți-l în folderul XAMPP și adăugați calea către el php.ini fişier.

În calitate de dezvoltator PHP, ar trebui să cunoașteți de acum înainte "replicul" Gothub repo al lui José Gonzalez, care conține multe utilități pentru dvs. Dacă v-ați întrebat vreodată cum să instalați PHP 5.4 manual, sunteți chiar acolo.

Dacă întâmpinați probleme în timp ce instalați Homebrew, consultați cititorul lui Jose.

Pentru a finaliza excursia noastră Homebrew, vrem să "atingem" formulele de preparare ale lui Jose executând următoarele comenzi în cadrul aplicației terminale:

bea tap homebrew / dupes

Acest lucru ne va aduce unele dependențe de care avem nevoie pentru formulele lui Jose.

bea tap josegonzalez / homebrew-php

Terminat! Acum ar trebui să fim gata să instalăm Xdebug în mod comfortabil, pe un Mac.


Instalați Xdebug

Înapoi în aplicația terminalului, vă rugăm să executați:

brew instalați php54-xdebug

Dacă sunteți pe PHP 5.3, înlocuiți "4" cu "3";)

Instalarea va dura ceva timp. După ce ați terminat, veți vedea o mică pictogramă de bere și câteva instrucțiuni suplimentare pe care le puteți ignora.

Ce sa întâmplat? Homebrew a descărcat toate fișierele, inclusiv dependențele, și le-a construit pentru dvs. După cum v-am spus deja, compilarea pe Mac poate fi un hassle. În final, avem o compilație proaspătă xdebug.so situat la /usr/local/Cellar/php54-xdebug/2.2.1/.

Atenție: Rețineți că Homebrew va instala PHP 5.4 în sistemul dvs. în timpul procesului. Acest lucru nu trebuie să influențeze nimic, deoarece nu este activat în sistemul dvs..

Pentru a instala în final Xdebug, trebuie doar să urmăm câțiva pași.

Schimbați directorul (CD) în dosarul extensiilor MAMP:

cd /Applications/MAMP/bin/php/php5.4.4/lib/php/extensions/no-debug-non-zts-20100525

Puteți verifica din nou calea urmărind ultima linie din /Applications/MAMP/bin/php/php5.4.4/conf/php.ini, deoarece aici mergem.

Actualizați existența xdebug.so doar în cazul în care:

mv xdebug.so xdebug.so.bak

Apoi, copiați-vă construirea Homebrew Xdebug:

cp /usr/local/Cellar/php54-xdebug/2.2.1/xdebug.so /Applications/MAMP/bin/php/php5.4.4/lib/php/extensions/no-debug-non-zts-20100525/

Dacă doriți să forțați o copie (cp) pentru a suprascrie fișierele existente, pur și simplu tinta sursa cp -X.

Nu în ultimul rând, trebuie să modificăm php.ini fișier pentru a încărca fișierul extensie Xdebug. Deschis /Applications/MAMP/bin/php/php5.4.4/conf/php.ini cu un editor de text la alegere, mergeți la partea de jos și dezarhivați ultima linie eliminând punct și virgulă din față. Nu închideți fișierul încă.

Acum relansați MAMP, mergeți la http: //localhost/MAMP/phpinfo.php. Dacă totul a mers bine, ar trebui să găsiți acest lucru în cadrul producției:


Dacă da nu de lucru, vă rugăm să vă asigurați că ați copiat cu adevărat peste xdebug.so și aveți calea cea bună în dvs. php.ini fişier.


Începeți depanarea

Înainte de a începe efectiv depanarea, trebuie să activați Xdebug. Prin urmare, sper că nu v-ați închis php.ini, deoarece trebuie să adăugăm această linie până la sfârșit, după zend_extension opțiune:

xdebug.remote_enable = Activată

Salvați și închideți-vă php.ini fișier și reporniți MAMP. Mergi la http: //localhost/MAMP/phpinfo.php din nou și căutați xdebug.remote pe site. Valorile tale ar trebui să arate exact ca a mea:


Dacă nu, urmați aceeași procedură pe care ați adăugat-o remote_enable = Activat pentru celelalte afirmații de la sfârșitul anului php.ini fişier.

Acum, deschideți IDE-ul ales. Puteți folosi Xdebug cu o serie de soluții software populare precum Eclipse, Netbeans, PhpStorm și, de asemenea, Sublime Text. După cum am spus mai devreme, voi folosi PhpStorm EAP 6 pentru acest demo.

În interiorul PhpStorm, deschideți preferințele aplicației și găsiți calea spre "PHP \ Debug \ DBGp Proxy" pe partea stângă, ca în imaginea de mai jos:


Acum alegeți cheia IDE personală. Acesta poate fi orice șir alfanumeric pe care îl doriți. Prefer să-i spun PhpStorm, dar XDEBUG_IDE sau numele meu ar fi chiar perfect. Este important să setați "Port" valoare pentru 9000 deoarece configurația noastră standard Xdebug folosește acest port pentru a se conecta la IDE.

Sfat: dacă trebuie să ajustați acest lucru, adăugați xdebug.remote_port = număr de port pentru dumneavoastră php.ini fişier.

Atenție: Alte componente pot schimba această valoare în interiorul programului PhpStorm, deci aveți grijă dacă nu se întâmplă ceva.

Apoi, faceți clic pe acel buton roșu pentru telefon, cu un mic bug de lângă el pe bara de instrumente de sus. Ar trebui să devină verde. Acest lucru face ca PhpStorm să asculte conexiunile Xdebug.


Acum trebuie să creăm ceva pentru depanare. Creați un nou fișier PHP, sunați-l după cum doriți și inserați în următorul cod:

 

Acum, acest cod este fals în mod implicit, dar îl vom rezolva într-un moment, în secțiunea următoare.

Asigurați-vă că totul este salvat și deschideți browserul în scriptul pe care tocmai l-am creat. Voi folosi Google Chrome pentru această demonstrație, dar orice browser va face.

Acum, să luăm o clipă pentru a înțelege cum este inițializat procesul de depanare. Starea noastră actuală este: Xdebug activat ca extensie Zend, ascultând port 9000 pentru ca un cookie să apară în timpul unei solicitări. Acest modul cookie va purta o cheie IDE care ar trebui să fie aceeași cu cea pe care am stabilit-o în interiorul IDE-ului nostru. Pe măsură ce Xdebug vede cookie-ul care transmite cererea, va încerca să se conecteze la un proxy, IDE-ul nostru.

Deci, cum obținem cookie-ul în locul lui? lui PHP setcookie? Nu. Deși există mai multe moduri, chiar și unele pentru a obține acest lucru fără un cookie, vom folosi o extensie de browser puțin ca ajutor.

Instalați "Xdebug helper" "în browserul Google Chrome sau căutați orice extensie care o va face pentru browserul pe care îl utilizați.

După ce ați instalat extensia, faceți clic dreapta pe micile erori care apar în bara de adrese și accesați opțiunile. Configurați valoarea pentru cheia IDE pentru a se potrivi cu cheia pe care ați ales-o în IDE, cum ar fi:


După configurare, faceți clic pe eroare și selectați "Debug" din listă. Problema ar trebui să devină verde:


Acum, reveniți la PhpStorm sau IDE-ul dvs. de alegere și stabiliți un "breakpoint". Punctele de blocare sunt ca markerele pe o linie care le spun debuggerului să oprească execuția scenariului la punctul de întrerupere.

În PhpStorm, puteți adăuga puncte de întrerupere făcând clic pe spațiul de lângă numerele de linie de pe partea stângă:


Doar încercați să faceți clic pe locul unde apare punctul roșu pe ecran. Veți avea apoi un set de întrerupere la care scenariul dvs. ar trebui să întrerupă.

Notă: Puteți avea mai multe puncte de întrerupere în cât mai multe fișiere decât doriți.

Acum suntem toți pregătiți. Reveniți la browserul dvs., asigurați-vă că bug-ul este verde și reîncărcați pagina pentru a trimite cookie-ul cu următoarea solicitare.

Sfat: dacă setați un cookie, acesta va fi disponibil pentru următoarea solicitare.

Dacă totul merge conform planului, această fereastră ar trebui să apară în interiorul PhpStorm pentru a vă informa despre o conexiune de depanare primită:


Fereastra nu ți-a dat popup? Să facem câteva depanări și să repetăm ​​ce trebuie setat pentru a reuși:

  1. Ar trebui să găsești informații Xdebug în interiorul lui phpinfo ()de ieșire. Dacă nu, ia-o xdebug.so fișier în locul potrivit și configurați-vă php.ini fişier.
  2. Setați setările DBGp PhpStorm la cheia dvs. IDE, de ex. "PHPSTORM" și portul "9000".
  3. Asigurați-PhpStorm asculta conexiuni de depanare de intrare folosind pictograma de telefon roșu, care va deveni verde.
  4. Setați un punct de întrerupere în codul dvs. sau selectați "Run \ Break la prima linie în script-uri PHP" pentru a fi independent de orice puncte de întrerupere. Rețineți că acest lucru nu este potrivit pentru utilizare practică.
  5. Obțineți o extensie de browser pentru a seta cookie-ul Xdebug.
  6. Asigurați-vă că extensia browserului are aceeași cheie IDE pe care ați ales-o în interiorul IDE.
  7. Reîncarcă pagina și PhpStorm ar trebui să primească conexiunea.

Dacă obțineți dialogul văzut pe imaginea anterioară, acceptați-l. Acest lucru vă va duce în modul de depanare, după cum urmează:


Puteți vedea că programul de depanare a oprit execuția scriptului la punctul de întrerupere, evidențiind linia albastră. PHP așteaptă și este acum controlată de Xdebug, care este condus de mâinile tale de acum încolo.

Spațiul nostru principal de lucru va fi secțiunea inferioară a IDE care arată deja unele informații despre scriptul care rulează (superglobals).


Și te-ai uita la asta? Există cookie-ul pe care tocmai l-am setat pentru a începe sesiunea de depanare. Acum puteți să faceți clic pe superglobalii și să le examinați valorile în acest moment. PHP este în așteptare, nu există nici o limită de timp, cel puțin nu implicit 30 de secunde.

În partea stângă, veți vedea câteva butoane. Pentru moment, numai "Joaca" și "Stop" sunt de interes pentru noi. Butonul verde de redare va relua scriptul. Dacă există un alt punct de întrerupere în cod, scenariul va continua până când ajunge la punctul de întrerupere și va opri din nou.

Butonul de stop roșu anulează scenariul. La fel ca PHP Ieșire sau a muri ar face.


Acum, lucrurile cu adevărat interesante vin în secțiunea superioară a ferestrei de depanare:


Să le verificăm rapid:

  1. Pas peste: Aceasta înseamnă pasul cu o linie înainte.
  2. Pășește înăuntru: Dacă linia albastră evidențiază, de exemplu, un apel de funcționare, acest buton vă permite să treceți prin cunoștințele funcției.
  3. Iesi afara: Dacă ați intrat într-o funcție și doriți să ieșiți înainte să se ajungă la final, trebuie doar să ieșiți.
  4. Rulați la cursor: Să presupunem că, de exemplu, fișierul dvs. are o lungime de 100 de linii și punctul dvs. de pauză a fost setat la linia doi pentru a inspecta ceva. Acum doriți să rulați rapid la punctul în care ați făcut clic pe cursorul dvs. - acest buton este pentru dvs. Puteți face clic pe "Pas peste" n timpuri prea;)

Acum nu vă faceți griji, pe măsură ce utilizați Xdebug, vă veți adapta rapid la comenzile rapide de pe tastatură.


De fapt, se debughează un exemplu de cod

V-am spus deja că codul pe care îl copiați / lipiți este fals, deci va trebui să îl depanați. Începeți trecerea peste cod, instrucțiune după instrucțiune.

Rețineți că linia albastră se oprește numai pe liniile care conțin de fapt o comandă. Spațiul alb și comentariile vor fi ignorate.

Odată ce ați ajuns la apelul la funcție incarca date, Vă rog nu intrați în ea, doar treci peste și se oprește pe dacă afirmație.


Puteți vedea două variabile noi în „Variabile“ panou din partea de jos a ecranului. Acum, de ce a făcut-o $ date varianta returnata false? Se pare că scenariul ar fi trebuit să-și facă treaba. Hai să aruncăm o privire. Du-te înapoi la linia șapte pentru a intra în funcția de apel -> bam! Avem un mesaj care ne informează că nu putem "să renunțăm". Pentru a obține depanatorul dvs. la linia șapte din nou, trebuie să opriți această sesiune și reîncărcați pagina în browser. Faceți acest lucru și intrați în funcția de apel de această dată.

Opriți pe întoarcere declarație în interiorul incarca date funcționează și vedeți ce sa întâmplat:


$ phpData matricea este goală. întoarcere declarația utilizează un operator ternar pentru a detecta ce trebuie returnat. Și se va întoarce fals pentru o matrice goală.

Fixați linia pentru a spune:

returnați $ phpData;

La fel de json_decode va returna datele sau nul pe eșec. Acum, opriți sesiunea de depanare, reîncărcați browserul și treceți de această dată această funcție.


Acum se pare că avem încă o problemă când intrăm în condiție. Vă rugăm să remediați condiția de utilizare is_null () pentru a detecta ce se întâmplă:

dacă (is_null ($ data)) die ('Nu s-a putut încărca datele'); 

Acum depinde de tine să încerci și să te apropii puțin. Aș sugera să readuce scriptul la versiunea originală de fals, să o depanezi ecouși apoi comparați modul în care se simte în comparație cu utilizarea Xdebug.


Concluzie

În tot acest articol ar fi trebuit să câștigați multe cunoștințe noi. Nu ezita să o citești din nou și să-i ajuți pe un prieten să instaleze Xdebug - nimic mai bun decât asta!

Poate doriți să încercați să înlocuiți comportamentul dvs. obișnuit de depanare folosind Xdebug. Mai ales în cazul proiectelor mai mari, orientate spre obiecte, deoarece devin mult mai ușor de depanat și chiar prindeți fluxul, dacă nu obțineți nimic imediat.

Rețineți că acesta este doar vârful aisbergului. Xdebug oferă mult mai multă putere care trebuie explorată.

Nu ezitați să puneți întrebări în comentariile dvs. și spuneți-mi ce credeți.

Cod