Xdebug - Professionele PHP-foutopsporing

Onze agenda

  1. Inleiding tot het onderwerp.
  2. Downloaden en installeren van Xdebug op uw lokale computer (Mac OS X 10.6.6+, MAMP 2.1.1).
  3. Integratie met PhpStorm.
  4. Oefen debuggen.

Wat je nodig zult hebben

  • Een Mac met Mac OS X 10.6.6+.
    • Als je op 10.8.X bent mei moet XQuartz installeren als Apple X11 heeft verwijderd.
    • Als u Windows gebruikt, is het hele proces iets eenvoudiger, klik gewoon op Google voor meer informatie.
  • Apple Xcode 4.6 (gratis in de Mac App Store).
    • Commandoregel-tools.
  • homebrew.
  • Een terminal-app naar keuze.
  • PhpStorm 5+ (veel andere IDE's zullen ook werken).

Wat is Xdebug?

Nou, technisch gezien is Xdebug een uitbreiding voor PHP om je leven gemakkelijker te maken tijdens het debuggen van je code. Op dit moment ben je misschien gewend om je code te debuggen met verschillende andere eenvoudige oplossingen. Deze omvatten het gebruik van echo uitspraken in verschillende staten binnen uw programma om te achterhalen of uw toepassing een voorwaarde doorgeeft of om de waarde van een bepaalde variabele te krijgen. Verder zou je vaak functies als kunnen gebruiken var_dump, print_r of anderen om objecten en matrices te inspecteren.

Wat ik vaak tegenkom zijn kleine hulpfuncties, zoals deze bijvoorbeeld:

functie dump ($ waarde) echo '
'; var_dump ($ value); echo '
';

De waarheid is dat ik dit ook al heel lang deed.

De waarheid is dat ik dit ook al heel lang deed. Dus wat is er mis mee? Technisch gezien is er niets mis mee. Het werkt en doet wat het zou moeten doen.

Maar stel je even voor, terwijl je applicaties evolueren, kun je er de gewoonte van maken om je code helemaal opnieuw te verspreiden met kleine echo's, var_dumps en aangepaste debuggers. Dit is nu niet toegestaan ​​tijdens uw testworkflow, maar wat als u vergeet sommige van die foutopsporingscode te verwijderen voordat deze naar de productie gaat? Dit kan een aantal behoorlijk enge problemen veroorzaken, omdat die kleine debuggers zelfs hun weg kunnen vinden naar versiebeheer en daar lang kunnen blijven.

De volgende vraag is: hoe debuggen jullie in productie? Nogmaals, stel je voor dat je surft op een van je favoriete webservices en plotseling krijg je een grote hoeveelheid dump van foutopsporingsinformatie die je op het scherm wordt gepresenteerd. Nu kan het natuurlijk verdwijnen na de volgende vernieuwing van de browser, maar het is geen goede ervaring voor de gebruiker van de website.

Tenslotte, heb je ooit je code regel voor regel willen bekijken, uitdrukkingen kunnen bekijken en zelfs een functie-oproep willen doen om te zien waarom het de verkeerde retourwaarde produceert??

Nou, je moet zeker in de wereld van professionele debugging duiken Xdebug, omdat het alle bovenstaande problemen kan oplossen.


MAMP configureren

Ik wil niet te diep ingaan op het download- en installatieproces van MAMP op een Mac. In plaats daarvan zal ik gewoon met je delen dat ik PHP 5.4.4 en de standaard Apache-poort (80) gebruik tijdens dit lezen.


Je eerste beslissing

Een korte opmerking voordat we beginnen met het bouwen van onze eigen Xdebug via Homebrew: als je de gemakkelijkste route wilt nemen, wordt MAMP al geleverd met Xdebug 2.2.0. Om het in te schakelen, open je:

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

met een teksteditor van je keuze, ga helemaal naar beneden en maak de laatste regel uncomment door de ;.

De laatste twee regels van het bestand zouden als volgt moeten luiden:

[xdebug] zend_extension = "/ Toepassingen / MAMP / bin / php / php5.4.4 / lib / php / extensions / no-debug-non-zts-20100525 / xdebug.so"

Nu, als je jezelf afvraagt:

"Waarom zou ik een hardere manier willen kiezen dan deze?"

En mijn antwoord daarop is dat het nooit een vergissing is om verder dan je rand te kijken en iets nieuws te leren. Met name als ontwikkelaar is het op een gegeven moment altijd handig een servergerelateerd spul in de gaten te houden. beloofde.


Installeer Xcode- en opdrachtregelprogramma's

Je kunt Apple Xcode gratis krijgen via de Mac App Store. Nadat je het hebt gedownload, ga je naar de applicatie-voorkeuren, klik op de "Downloads" tab en installeer de "Opdrachtregelhulpmiddelen" van de lijst.


Installeer Homebrew

Homebrew is een nette kleine pakketbeheerder voor Mac OS X waarmee je alles krijgt wat Apple heeft achtergelaten. Om Homebrew te installeren, plakt u de volgende opdracht in uw terminal.

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

Op een Mac is Homebrew de handigste manier om Xdebug te installeren. Op Linux is het echter de beste manier om het zelf te compileren; wat niet zo eenvoudig is op een Mac.

Tip: Windows-gebruikers hoeven het alleen maar te downloaden * .dll bestand van Xdebug.org, plaats het in de XAMPP-map en voeg het pad toe aan hun php.ini het dossier.

Als ontwikkelaar van PHP moet je vanaf nu bekend zijn met de "homebrew-php" Github repo van Jose Gonzalez, die veel nuttige "brouwsels" voor je bevat. Als je je ooit hebt afgevraagd hoe je PHP 5.4 handmatig moet installeren, dan ben je er.

Als je nu problemen ondervindt bij het installeren van Homebrew, lees dan eens de Readme van Jose.

Om onze Homebrew-excursie te voltooien, willen we "tappen" in de brouwersformules van Jose door de volgende opdrachten uit te voeren in uw terminaltoepassing:

brouwen tap homebrew / dupes

Dit zal ons afhankelijkheden bezorgen die we nodig hebben voor Jose's formules.

brouw tap josegonzalez / homebrew-php

Gedaan! Nu moeten we klaar zijn om Xdebug op de comfortabele manier te installeren, op een Mac.


Installeer Xdebug

Terug in uw terminalapplicatie, voer alstublieft uit:

zet php54-xdebug klaar

Als je PHP 5.3 gebruikt, vervang je de "4" door een "3";)

De installatie zal enige tijd duren. Nadat het klaar is, ziet u een klein bierpictogram en enkele verdere instructies die u kunt negeren.

Dus wat is er net gebeurd? Homebrew heeft alle bestanden inclusief hun afhankelijkheden gedownload en voor u gebouwd. Zoals ik al zei, kan het lastig zijn om jezelf op een Mac te compileren. Aan het eind kregen we een nieuw samengesteld rapport xdebug.so gevestigd in /usr/local/Cellar/php54-xdebug/2.2.1/.

Let op: Homebrew zal tijdens het proces PHP 5.4 op uw systeem installeren. Dit zou niets moeten beïnvloeden omdat het niet is ingeschakeld op uw systeem.

Om Xdebug eindelijk te installeren, moeten we nog een paar stappen volgen.

Verander directory (CD) naar de map met extensies van MAMP:

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

U kunt het pad opnieuw controleren door naar de laatste regel te kijken /Applications/MAMP/bin/php/php5.4.4/conf/php.ini, zoals dit is waar we naartoe gaan.

Maak een backup van het bestaande xdebug.so voor het geval dat:

mv xdebug.so xdebug.so.bak

Kopieer vervolgens je Homebrew Xdebug-build:

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/

Als je een kopie wilt forceren (cp) opdracht om bestaande bestanden te overschrijven, gewoon doen cp -X brondoel.

Last, but not least, we moeten de php.ini bestand om het Xdebug-extensiebestand te laden. Open /Applications/MAMP/bin/php/php5.4.4/conf/php.ini met een teksteditor naar keuze, ga helemaal naar beneden en maak de laatste regel uncomment door de puntkomma aan de voorkant te verwijderen. Sluit niet het bestand nog niet.

Start nu MAMP opnieuw, ga naar http: //localhost/MAMP/phpinfo.php. Als alles goed is gegaan, zou je dit binnen de output moeten vinden:


Als dat zo was niet werk, zorg er alsjeblieft voor dat je echt gekopieerd hebt over de xdebug.so en heb het juiste pad in jouw php.ini het dossier.


Start Debugging

Voordat we daadwerkelijk kunnen beginnen met foutopsporing, moeten we Xdebug inschakelen. Daarom hoop ik dat je je niet hebt afgesloten php.ini, omdat we deze regel helemaal moeten toevoegen, na de zend_extension keuze:

xdebug.remote_enable = Aan

Bewaar en sluit uw php.ini bestand en herstart MAMP. Ga naar http: //localhost/MAMP/phpinfo.php opnieuw en zoek naar xdebug.remote op de site. Je waarden moeten er precies zo uitzien als de mijne:


Als dat niet het geval is, volgt u dezelfde procedure die u hebt gebruikt om toe te voegen remote_enable = Aan voor de andere verklaringen aan het einde van uw php.ini het dossier.

Open nu uw IDE naar keuze. Je kunt Xdebug gebruiken met een aantal populaire software-oplossingen zoals Eclipse, Netbeans, PhpStorm en ook Sublime Text. Zoals ik al eerder zei, ik ga PhpStorm EAP 6 gebruiken voor deze demo.

Open binnen PhpStorm de toepassingsvoorkeuren en vind de weg naar "PHP \ Debug \ DBGp Proxy" aan de linkerkant, zoals in de onderstaande schermafbeelding:


Kies nu uw persoonlijke IDE-sleutel. Dit kan elke gewenste alfanumerieke reeks zijn. Ik noem het liever gewoon PHPSTORM, maar XDEBUG_IDE of mijn naam zou ook prima zijn. Het is belangrijk om de "Haven" waarde voor 9000 omdat onze standaard Xdebug-configuratie deze poort gebruikt om verbinding te maken met de IDE.

Tip: als u dit moet aanpassen, voegt u toe xdebug.remote_port = poortnummer aan jouw php.ini het dossier.

Let op: andere componenten kunnen deze waarde binnen PhpStorm wijzigen, dus pas op voor het geval er iets niet lukt.

Klik vervolgens op die rode telefoonknop met een kleine bug ernaast op de bovenste werkbalk. Het moet groen worden. Hierdoor luistert PhpStorm naar binnenkomende Xdebug-verbindingen.


Nu moeten we iets maken om te debuggen. Maak een nieuw PHP-bestand, noem het wat je maar wilt en plak in de volgende code:

 

Nu is deze code standaard vals, maar we zullen deze in een moment, in het volgende gedeelte, repareren.

Zorg dat alles is opgeslagen en open uw browser voor het script dat we zojuist hebben gemaakt. Ik zal Google Chrome gebruiken voor deze demo, maar elke browser zal het doen.

Laten we nu een moment nemen om te begrijpen hoe het foutopsporingsproces is geïnitialiseerd. Onze huidige status is: Xdebug geactiveerd als Zend extensie, luisterend poort 9000 voor het verschijnen van een cookie tijdens een aanvraag. Deze cookie draagt ​​een IDE-sleutel die dezelfde moet zijn als degene die we in onze IDE installeren. Terwijl Xdebug het cookie ziet dat het verzoek draagt, probeert het verbinding te maken met een proxy, onze IDE.

Dus hoe krijgen we dat koekje op zijn plaats? PHP setcookie? Nee. Hoewel er meerdere manieren zijn, zelfs sommige om dit zonder een cookie te laten werken, gebruiken we een kleine browserextensie als hulp.

Installeer de "Xdebug helper" "in uw Google Chrome-browser of zoek naar een extensie die dit doet voor de browser die u gebruikt.

Nadat u de extensie hebt geïnstalleerd, klikt u met de rechtermuisknop op de kleine fout in de adresbalk en gaat u naar de opties. Configureer de waarde voor de IDE-sleutel die overeenkomt met de sleutel die u in uw IDE hebt gekozen, zoals:


Na het configureren, klikt u op de bug en selecteert u "Debug" van de lijst. De bug zou groen moeten worden:


Ga nu terug naar PhpStorm of uw IDE naar keuze en stel een "breekpunt" in. Onderbrekingspunten zijn als markeringen op een regel die de debugger vertellen om de uitvoering van het script bij dat breekpunt te stoppen.

In PhpStorm kunt u eenvoudig breekpunten toevoegen door op de spatie naast de regelnummers aan de linkerkant te klikken:


Probeer gewoon te klikken waar de rode stip op de schermafbeelding wordt weergegeven. Je hebt dan een breekpunt ingesteld waarop je script moet pauzeren.

Opmerking: u kunt meerdere onderbrekingspunten in zoveel bestanden opslaan als u wilt.

Nu zijn we helemaal klaar. Ga terug naar uw browser, zorg dat de bug groen is en laad de pagina opnieuw om de cookie bij de volgende aanvraag in te dienen.

Tip: als u een cookie instelt, is deze beschikbaar voor het volgende verzoek.

Als alles volgens plan verloopt, verschijnt dit venster in PhpStorm om u te informeren over een inkomende foutopsporingsverbinding:


Verscheen het venster niet voor u? Laten we wat probleemoplossing uitvoeren en herhalen wat er moet worden ingesteld om dit te laten slagen:

  1. Je zou Xdebug info binnenin moeten vinden phpinfo ()uitvoer. Zo niet, pak de xdebug.so bestand op de juiste plaats en stel je in php.ini het dossier.
  2. Stel PhpStorm DBGp-instellingen in op uw IDE-sleutel, bijvoorbeeld "PHPSTORM" en poort "9000".
  3. Laat PhpStorm luisteren naar inkomende foutopsporingsverbindingen met behulp van het rode telefoonpictogram dat dan groen wordt.
  4. Stel een onderbrekingspunt in uw code in of selecteer "Run \ Break op de eerste regel in PHP-scripts" onafhankelijk zijn van eventuele breekpunten. Merk op dat dit niet geschikt is voor praktisch gebruik.
  5. Download een browserextensie om de Xdebug-cookie in te stellen.
  6. Zorg ervoor dat de browserextensie dezelfde IDE-sleutel heeft die u in uw IDE hebt gekozen.
  7. Herlaad de pagina en PhpStorm moet de verbinding krijgen.

Als u het dialoogvenster van de vorige afbeelding ziet, accepteer het dan. Dit brengt u naar de debug-modus, zoals zo:


U kunt zien dat de foutopsporing de uitvoering van het script bij uw breekpunt heeft gestopt en de lijn in het blauw markeert. PHP staat nu te wachten en wordt bestuurd door Xdebug, dat vanaf nu wordt bestuurd door je eigen handen.

Onze hoofdwerkruimte zal de onderste sectie van de IDE zijn die al enige informatie toont over het lopende script (de superglobals).


En zou je daar naar kijken? Daar is de cookie die we zojuist hebben ingesteld om de foutopsporingssessie te starten. Je kunt nu door de superglobalen klikken en hun waarden op dit moment bekijken. PHP wacht, er is geen tijdslimiet, althans niet de standaard 30 seconden.

Aan de linkerkant zie je een paar knoppen. Voor nu alleen "Spelen" en "Hou op" zijn voor ons van belang. De groene afspeelknop zal het script hervatten. Als er een ander breekpunt in de code is, gaat het script door totdat het het breekpunt bereikt en stopt het opnieuw.

De rode stopknop breekt het script af. Net zoals PHP's Uitgang of dood gaan zou doen.


Nu komen de echt interessante in het bovenste gedeelte van het debug-venster:


Laten we snel kijken:

  1. Overstappen: Dit betekent stap een lijn verderop.
  2. Stap in: Als de blauwe lijn bijvoorbeeld een functieaanroep markeert, kunt u met deze knop door de inzichten van de functie bladeren.
  3. Uitstappen: Als u een functie binnenstapte en wilt uitstappen voordat het einde is bereikt, stapt u gewoon uit.
  4. Ren naar cursor: Laten we zeggen dat uw bestand bijvoorbeeld 100 regels lang is en dat uw breekpunt op regel twee staat om iets te inspecteren. Nu wil je snel rennen naar het punt waar je zojuist op je cursor klikte - deze knop is voor jou. U kunt klikken "Overstappen" n keer ook;)

Maak je geen zorgen, omdat je Xdebug gebruikt, zul je je snel aanpassen aan de snelkoppelingen op het toetsenbord.


Feitelijk debuggen van een voorbeeldcode

Ik heb je al gezegd dat de code die je kopieert / plakt, vals is, dus je moet het debuggen. Begin met het overstappen van de code, statement by statement.

Merk op dat de blauwe lijn alleen stopt op regels die daadwerkelijk een commando bevatten. Whitespace en opmerkingen worden overgeslagen.

Nadat u de functie hebt bereikt, belt u naar loadData, alsjeblieft stap er niet in, stap gewoon over en stop op de als uitspraak.


U ziet twee nieuwe variabelen in de "Variabelen" paneel aan de onderkant van het scherm. Nu, waarom deed het $ data variabele return false? Het lijkt erop dat het script zijn werk had moeten doen. Laten we kijken. Ga terug naar regel zeven om naar de functieaanroep te gaan -> bam! We krijgen een bericht waarin we worden geïnformeerd dat we niet "een stap terug kunnen doen". Om je debugger weer op regel 7 te krijgen, moet je deze sessie stoppen en de pagina opnieuw laden in de browser. Doe dit en stap deze keer in de functieaanroep.

Stop op de terugkeer verklaring binnenkant van de loadData functie en zie wat er is gebeurd:


De $ phpData array is leeg. De terugkeer statement gebruikt een ternaire operator om te detecteren wat moet worden geretourneerd. En het zal terugkeren vals voor een lege array.

Bevestig de regel om te zeggen:

return $ phpData;

Zoals json_decode zal ofwel de gegevens ofwel retourneren nul bij falen. Stop nu de foutopsporingssessie, laad uw browser opnieuw en stap deze keer over de functieaanroep.


Nu lijkt het erop dat we nog steeds een probleem hebben als we in de toestand stappen. Corrigeer de voorwaarde om te gebruiken is niets() om te detecteren wat er gebeurt:

if (is_null ($ data)) die ('Kon gegevens niet laden'); 

Nu is het aan jou om een ​​beetje rond te lopen. Ik zou willen voorstellen om het script terug te zetten naar de originele falsy-versie, het te debuggen met echois en vergelijk dan hoe dat voelt in vergelijking met het gebruik van Xdebug.


Conclusie

In dit artikel had u veel nieuwe kennis moeten opdoen. Aarzel niet om het opnieuw te lezen en om een ​​vriend te helpen bij het opzetten van Xdebug - niets beters dan dat!

U kunt proberen om uw gebruikelijke debuggedrag te vervangen door Xdebug te gebruiken. Vooral met grotere, object-georiënteerde projecten, omdat ze veel eenvoudiger te debuggen zijn en zelfs de stroom in te halen, als je niet meteen iets krijgt.

Merk op dat dit slechts het topje van de ijsberg is. Xdebug biedt veel meer kracht die ook moet worden onderzocht.

Aarzel niet om vragen in de comments te stellen en laat me weten wat je ervan vindt.