Xdebug - Professionell PHP Debugging

Vår agenda

  1. Introduktion till ämnet.
  2. Nedladdning och installation av Xdebug på din lokala dator (Mac OS X 10.6.6+, MAMP 2.1.1).
  3. Integrera med PhpStorm.
  4. Öva felsökning.

Vad du kommer att behöva

  • En Mac som kör Mac OS X 10.6.6+.
    • Om du är på 10.8.X dig Maj behöver installera XQuartz när Apple har tagit bort X11.
    • Om du är på Windows är hela processen något enklare, bara träffa Google för mer information.
  • Apple Xcode 4.6 (gratis på Mac App Store).
    • Kommandoradsverktyg.
  • homebrew.
  • En terminal app till ditt val.
  • PhpStorm 5+ (många andra IDEs kommer också att fungera).

Vad är Xdebug?

Tekniskt är Xdebug en förlängning för PHP för att göra ditt liv enklare när du felsöker din kod. Just nu kan du vara van vid att felsöka din kod med olika andra enkla lösningar. Dessa inkluderar användning eko uttalanden i olika stater inom ditt program för att ta reda på om din ansökan skickar ett villkor eller för att få värdet av en viss variabel. Dessutom kan du ofta använda funktioner som var_dump, print_r eller andra att inspektera objekt och arrays.

Vad jag ofta stöter på är lilla hjälparfunktioner, till exempel den här:

funktion dumpning ($ värde) echo '
'; var_dump ($ value); eko "
';

Sanningen är det, jag brukade göra det också, under en mycket lång tid faktiskt.

Sanningen är det, jag brukade göra det också, under en mycket lång tid faktiskt. Så vad är det för fel? Tekniskt sett finns det inget fel med det. Det fungerar och gör vad det ska göra.

Men föreställ dig en stund, eftersom dina applikationer utvecklas kan du bli van vid att sprinkla din kod överallt med små echos, var_dumps och anpassade debuggers. Nu beviljas detta inte obstruktivt under testprocessen, men vad händer om du glömmer att städa bort en del av den här felsökningskoden innan den går till produktion? Detta kan orsaka några ganska skrämmande problem, eftersom de små debuggrarna kanske kan hitta sig in i versionskontrollen och stanna kvar länge.

Nästa fråga är: hur debuggar du i produktion? Återigen, föreställ dig att du surfar på en av dina favoritwebtjänster och plötsligt får du en stor gruppdump av felsökningsinformation som presenteras för dig på skärmen. Nu kan det naturligtvis försvinna efter nästa uppdatering av webbläsaren, men det är inte en mycket bra upplevelse för användaren av webbplatsen.

Nu har du äntligen önskat att kunna gå igenom din kod, linje för rad, titta på uttryck och till och med gå in i ett funktionssamtal för att se varför det ger fel returvärde?

Nåväl, du borde definitivt gräva i världen med professionell debugging med xdebug, eftersom det kan lösa alla problem ovan.


Konfigurera MAMP

Jag vill inte gå för djupt i hämtnings- och installationsprocessen för MAMP på en Mac. Istället delar jag bara med dig att jag använder PHP 5.4.4 och standard Apache Port (80) under hela denna läsning.


Ditt första beslut

En snabb notering innan vi börjar med att bygga vår egen Xdebug via Homebrew: Om du vill ha den enklaste vägen kommer MAMP redan med Xdebug 2.2.0. För att aktivera den, öppna:

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

med en textredigerare efter eget val går du längst ner och uncomment den sista raden genom att ta bort ;.

De två sista raderna i filen ska läsa så här:

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

Nu om du frågar dig själv:

"Varför skulle jag vilja välja ett hårdare sätt än den här?"

Och mitt svar på det är att det aldrig är ett misstag att se bortom din fälg och lära dig något nytt. Särskilt som utvecklare i dessa dagar kommer kasta ett öga på serverrelaterade saker alltid att vara till nytta vid någon tidpunkt. lovade.


Installera Xcode och Command Line Tools

Du kan få Apple Xcode gratis från Mac App Store. När du har laddat ner det, gå till programinställningarna, klicka på "Nedladdningar" fliken och installera "Kommandoradsverktyg" från listan.


Installera Homebrew

Homebrew är en snygg liten pakethanterare för Mac OS X som ger dig alla saker Apple lämnat ut. För att installera Homebrew klickar du bara på följande kommando i din terminal.

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

På en Mac är Homebrew det bekvämaste sättet att installera Xdebug. På Linux är det dock det bästa sättet att sammanställa det själv. vilket inte är så enkelt på en Mac.

Tips: Windows-användare behöver bara ladda ner * .dll filen från Xdebug.org, lägg den i mappen XAMPP och lägg till sökvägen till deras php.ini fil.

Som PHP-utvecklare borde du från och med nu vara medveten om Jose Gonzalezs "homebrew-php" Github repo, som innehåller många användbara "brews" för dig. Om du någonsin har frågat dig själv hur man installerar PHP 5.4 manuellt, har du rätt där.

Nu om du får problem när du installerar Homebrew, kolla in Jose's Readme.

För att slutföra vår Homebrew-utflykt vill vi "knacka" på Jose's bryggformar genom att utföra följande kommandon inom din terminala applikation:

brygga på hakbräda / dupes

Detta kommer att få oss några beroenden vi behöver för Jose's formler.

brygga på josegonzalez / homebrew-php

Gjort! Nu ska vi vara redo att installera Xdebug på det bekväma sättet, på en Mac.


Installera Xdebug

Tillbaka i din terminaltillämpning, exekvera:

brygga installera php54-xdebug

Om du är på PHP 5.3, ersätt bara "4" med en "3";)

Installationen tar lite tid. När det är klart ser du en liten ölikon och några ytterligare instruktioner som du kan ignorera.

Så vad hände just? Homebrew hämtade alla filer inklusive deras beroenden och byggde dem för dig. Som jag redan har sagt till dig kan det vara svårt att kompilera dig på en Mac. I slutet fick vi en ny kompilering xdebug.so belägen vid /usr/local/Cellar/php54-xdebug/2.2.1/.

OBS: Observera att Homebrew installerar PHP 5.4 till ditt system under processen. Detta bör inte påverka något eftersom det inte är aktiverat på ditt system.

För att slutligen installera Xdebug behöver vi bara följa några steg.

Ändra katalog (CD) till MAMPs tilläggsmapp:

cd /applikationer/mamp/bin/php/php5.4.4/lib/php/extensions/no-debug-non-zts-20100525

Du kan ompröva sökvägen genom att titta på den sista raden av /Applications/MAMP/bin/php/php5.4.4/conf/php.ini, som det är här vi går.

Säkerhetskopiera befintliga xdebug.so utifall att:

mv xdebug.so xdebug.so.bak

Kopiera sedan din Homebrew Xdebug bygga:

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/

Om du vill tvinga en kopia (cp) kommandot att skriva över befintliga filer, gör bara cp -X-källmål.

Sist men inte minst måste vi ändra php.ini fil för att ladda Xdebug-förlängningsfilen. Öppna /Applications/MAMP/bin/php/php5.4.4/conf/php.ini med en textredigerare efter eget val, gå längst ner och uncomment den sista raden genom att ta bort semicolonen på framsidan. Stäng inte filen just ännu.

Nu starta om MAMP, gå till http: //localhost/MAMP/phpinfo.php. Om allt gick bra, borde du hitta det här inom produktionen:


Om det gjorde det inte jobb, var noga med att du verkligen kopierade över xdebug.so och ha rätt väg i din php.ini fil.


Starta debugging

Innan vi faktiskt kan starta felsökning måste vi aktivera Xdebug. Därför hoppas jag inte stänga din php.ini, som vi behöver lägga till den här raden till slutet, efter zend_extension alternativ:

xdebug.remote_enable = På

Spara och stäng din php.ini fil och starta om MAMP. Gå till http: //localhost/MAMP/phpinfo.php igen och leta efter xdebug.remote på plats. Dina värden ska se ut som min:


Om de inte gör det, följ samma procedur som du brukade lägga till remote_enable = På för de andra uttalandena i slutet av din php.ini fil.

Öppna nu ditt IDE-val. Du kan använda Xdebug med ett antal populära mjukvarulösningar som Eclipse, Netbeans, PhpStorm och Sublime Text. Som jag sa tidigare, kommer jag att använda PhpStorm EAP 6 för den här demo.

Inne i PhpStorm öppnar du programinställningarna och hittar dig till "PHP \ Debug \ DBGp Proxy" på vänster sida, som i skärmbilden nedan:


Välj nu din personliga IDE-nyckel. Detta kan vara vilken alfanumerisk sträng du vill ha. Jag föredrar att bara kalla det PHPSTORM, men XDEBUG_IDE eller mitt namn det skulle också vara bra. Det är viktigt att ställa in "Hamn" värde till 9000 eftersom vår standard Xdebug-konfiguration använder den här porten för att ansluta till IDE.

Tips: Om du behöver justera detta lägger du till xdebug.remote_port = portnummer till din php.ini fil.

OBS: Andra komponenter kan ändra detta värde inuti PhpStorm, så se upp för det om något misslyckas.

Klicka sedan på den röda lilla telefonen knappen med en liten bugg bredvid den på den övre verktygsfältet. Det ska bli grönt. Detta gör att PhpStorm lyssnar på inkommande Xdebug-anslutningar.


Nu behöver vi skapa något att felsöka. Skapa en ny PHP-fil, ring den som du vill och klistra in i följande kod:

 

Nu är den här koden förfalskad som standard, men vi fixar det på ett ögonblick, i nästa avsnitt.

Se till att allt är sparat och öppna webbläsaren till det skript vi just skapat. Jag kommer att använda Google Chrome för den här demoen, men vilken webbläsare som helst kommer att göra.

Nu tar vi en stund att förstå hur debuggingprocessen initieras. Vår nuvarande status är: Xdebug aktiverad som Zend-förlängning, lyssnar på hamn 9000 för att en cookie ska visas under en förfrågan. Den här kakan kommer att ha en IDE-nyckel som borde vara densamma som den som vi satt upp inom vår IDE. Som Xdebug ser cookien som bär begäran, försöker den ansluta till en proxy, vår IDE.

Så hur får vi den kakan på plats? PHP setcookie? Nej. Även om det finns flera sätt, även om några kan få det att fungera utan en cookie, använder vi en liten webbläsareutvidgning som en hjälpare.

Installera "Xdebug-hjälpen" "i din Google Chrome-webbläsare eller sök efter eventuella tillägg som gör det för webbläsaren du använder.

När du har installerat tillägget högerklickar du på den lilla buggen som visas i adressfältet och går till alternativen. Konfigurera värdet för IDE-tangenten för att matcha den nyckel du valde i din IDE, så här:


Efter att du har konfigurerat det, klicka på felet och välj "Debug" från listan. Felet ska bli grönt:


Gå nu tillbaka till PhpStorm eller ditt IDE-val och ställ in en "breakpoint". Brytpunkter är som markörer på en rad som berättar debuggeren för att stoppa exekveringen av manuset vid den brytpunkten.

I PhpStorm kan du helt enkelt lägga till brytpunkter genom att klicka på mellanslag bredvid radnumret på vänster sida:


Försök bara klicka där den röda punkten visas på skärmdumpen. Då kommer du att ha en brytpunktsuppställning där ditt skript ska pausa.

Obs! Du kan ha flera brytpunkter i så många filer som du vill.

Nu är vi alla uppsatta. Gå tillbaka till din webbläsare, se till att felet är grönt och ladda om sidan för att skicka in cookien med nästa förfrågan.

Tips: Om du ställer in en cookie kommer den att vara tillgänglig för nästa förfrågan.

Om allt går enligt planen ska det här fönstret dyka upp inuti PhpStorm för att informera dig om en inkommande debug-anslutning:


Fick fönstret inte popup för dig? Låt oss göra några felsökning och upprepa vad som behöver ställas in för att detta skall lyckas:

  1. Du bör hitta Xdebug info inuti phpinfo ()s utdata. Om inte, få xdebug.so filen på rätt ställe och ställa in din php.ini fil.
  2. Ställ in PhpStorm DBGp-inställningar till din IDE-nyckel, t.ex. "PHPSTORM" och porten "9000".
  3. Gör PhpStorm för att lyssna på inkommande debug-anslutningar med den röda telefonikonen som då blir grön.
  4. Ange en brytpunkt i din kod, eller välj "Run \ Break i första raden i PHP-skript" att vara oberoende av eventuella brytpunkter. Observera att detta inte är lämpligt för praktisk användning.
  5. Få en webbläsareutvidgning för att ställa in Xdebug-cookien.
  6. Se till att webbläsarens tillägg har samma IDE-nyckel i den som du valde inuti din IDE.
  7. Ladda om sidan och PhpStorm ska få anslutningen.

Om du får dialogrutan som ses på föregående bild accepterar du det. Detta tar dig till debug-läge, som så:


Du kan se att felsökaren stoppade manusets körning vid din brytpunkt, och markerar linjen i blått. PHP väntar och kontrolleras nu av Xdebug, som styrs av dina egna händer från och med nu.

Vårt huvudsakliga arbetsområde är den nedre delen av IDE som redan visar lite information om det löpande skriptet (superglobalerna).


Och skulle du titta på det? Det finns den cookie som vi just ställt in för att starta felsökningssessionen. Du kan nu klicka igenom superglobalerna och inspektera deras värden just nu. PHP väntar, det finns ingen tidsgräns, åtminstone inte standard 30 sekunder.

På vänster sida ser du några knappar. För nu bara "Spela" och "Sluta" är av intresse för oss. Den gröna avspelningsknappen återupptar manuset. Om det finns en annan brytpunkt i koden, fortsätter skriptet tills det når brytpunkten och stannar igen.

Den röda stoppknappen avbryter skriptet. Precis som PHP: s utgång eller skulle göra.


Nu kommer de riktigt intressanta i den övre delen av felsökningsfönstret:


Låt oss snabbt kolla in dem:

  1. Kliva över: Detta betyder steg ett steg framåt.
  2. Stiga in i: Om den blå linjen lyfter fram, till exempel ett funktionssamtal, låter du denna knapp gå igenom funktionens insikter.
  3. Gå ut: Om du gick in i en funktion och vill gå ut innan slutet är nådd, gå bara ut.
  4. Kör till markören: Låt oss säga att din fil är till exempel 100 linjer lång och din brytpunkt ställdes in på rad två för att inspektera något. Nu vill du snabbt springa till den punkt där du bara klickade på markören till - den här knappen är till för dig. Du kan klicka "Kliva över" n gånger också;)

Oroa dig inte, eftersom du använder Xdebug kommer du snabbt att anpassa dig till genvägarna på tangentbordet.


Faktiskt debugging Some Example Code

Jag har redan sagt att koden du kopierar / klistras är falsk, så du måste debugera den. Börja stega över koden, uttalande genom uttalande.

Observera att den blå linjen bara stannar på rader som faktiskt innehåller ett kommando. Whitespace och kommentarer kommer att hoppas över.

När du har nått funktionssamtalet till ladda data, snälla du gå inte in i det, bara gå över och stanna på om påstående.


Du kan se två nya variabler i "Variables" panelen längst ner på skärmen. Nu, varför gjorde $ uppgifter variabel retur falskt? Det verkar som om manuset ska ha gjort sitt jobb. Låt oss ta en titt. Gå tillbaka till rad sju för att gå in i funktionssamtalet -> bam! Vi får ett meddelande som informerar oss om att vi inte kan "gå tillbaka". För att få din debugger att sätta igen sju, måste du stoppa den här sessionen och ladda om sidan i webbläsaren. Gör så och gå in i funktionsanropet denna gång.

Sluta på lämna tillbaka uttalande inuti ladda data funktionen och se vad som hände:


De $ phpData arrayen är tom. De lämna tillbaka uttalande använder en ternär operatör för att upptäcka vad som ska återvända. Och det kommer att återvända falsk för en tom array.

Fixa raden för att säga:

returnera $ phpData;

Som json_decode kommer antingen att returnera data eller null vid misslyckande. Stoppa nu debug-sessionen, ladda om din webbläsare och gå över funktionssamtalet här gången.


Nu verkar det som om vi fortfarande har problem när vi går in i skicket. Vänligen fixa villkoret att använda är inget() att upptäcka vad som händer:

om (is_null ($ data)) die ('Kunde inte ladda data'); 

Nu är det upp till dig att försöka gå lite. Jag föreslår att du återställer manuset till den ursprungliga falska versionen, debugger den med ekos och jämför sedan hur det känns i jämförelse med att använda Xdebug.


Slutsats

I hela denna artikel borde du ha fått mycket ny kunskap. Tveka inte att läsa den igen och för att hjälpa en vän att skapa Xdebug - inget bättre än det!

Du kanske vill försöka ersätta ditt vanliga felsökningsbeteende genom att använda Xdebug istället. Speciellt med större, objektorienterade projekt, eftersom de blir mycket lättare att felsöka och till och med hämta flödet, om du inte får något direkt.

Observera att detta bara är toppen av isberget. Xdebug erbjuder mycket mer kraft som behöver utforskas också.

Var vänlig och fråga några frågor i kommentarerna och låt mig veta vad du tycker.