Advertisement
  1. Code
  2. Tools & Tips

Xdebug - Professionelles PHP-Debugging

Scroll to top
Read Time: 14 min

German (Deutsch) translation by Katharina Grigorovich-Nevolina (you can also view the original English article)

Unsere Agenda

  1. Einführung in das Thema.
  2. Herunterladen und Installieren von Xdebug auf Ihrem lokalen Computer (Mac OS X 10.6.6+, MAMP 2.1.1).
  3. Integration in PhpStorm.
  4. Üben Sie das Debuggen.

Was werden Sie brauchen?

  • Ein Mac mit Mac OS X 10.6.6+.
    • Wenn Sie 10.8.X verwenden, müssen Sie möglicherweise XQuartz installieren, da Apple X11 entfernt hat.
    • Wenn Sie unter Windows arbeiten, ist der gesamte Vorgang etwas einfacher. Klicken Sie einfach auf Google, um weitere Informationen zu erhalten.
  • Apple Xcode 4.6 (kostenlos im Mac App Store).
    • Befehlszeilentools.
  • Homebrew.
  • Eine Terminal-App Ihrer Wahl.
  • PhpStorm 5+ (viele andere IDEs funktionieren auch).

Was ist Xdebug?

Technisch gesehen ist Xdebug eine Erweiterung für PHP, um Ihnen das Leben beim Debuggen Ihres Codes zu erleichtern. Im Moment sind Sie möglicherweise daran gewöhnt, Ihren Code mit verschiedenen anderen einfachen Lösungen zu debuggen. Dazu gehört die Verwendung von echo-Anweisungen in verschiedenen Zuständen Ihres Programms, um herauszufinden, ob Ihre Anwendung eine Bedingung erfüllt, oder um den Wert einer bestimmten Variablen abzurufen. Darüber hinaus können Sie häufig Funktionen wie var_dump, print_r oder andere verwenden, um Objekte und Arrays zu untersuchen.

Was mir oft begegnet, sind kleine Hilfsfunktionen, wie zum Beispiel diese:

Die Wahrheit ist, dass ich das auch sehr lange gemacht habe.

Die Wahrheit ist, dass ich das auch sehr lange gemacht habe. Also, was ist daran falsch? Technisch ist daran nichts auszusetzen. Es funktioniert und tut, was es tun sollte.

Aber stellen Sie sich für einen Moment vor, während Ihre Anwendungen sich weiterentwickeln, könnten Sie es sich zur Gewohnheit machen, Ihren Code mit kleinen Echos, var_dumps und benutzerdefinierten Debuggern zu bestreuen. Dies ist zwar während Ihres Testworkflows nicht hinderlich, aber was ist, wenn Sie vergessen, einen Teil dieses Debug-Codes zu bereinigen, bevor er in die Produktion geht? Dies kann einige ziemlich beängstigende Probleme verursachen, da diese winzigen Debugger möglicherweise sogar den Weg in die Versionskontrolle finden und dort lange bleiben.

Die nächste Frage lautet: Wie debuggen Sie in der Produktion? Stellen Sie sich erneut vor, Sie surfen in einem Ihrer bevorzugten Webdienste und erhalten plötzlich einen großen Array von Debug-Informationen, die Ihnen auf dem Bildschirm angezeigt werden. Jetzt kann es natürlich nach der nächsten Browseraktualisierung verschwinden, aber es ist keine sehr gute Erfahrung für den Benutzer der Website.

Wollten Sie schon immer einmal in der Lage sein, Ihren Code zeilenweise durchzugehen, Ausdrücke zu beobachten und sogar einen Funktionsaufruf zu starten, um zu sehen, warum er den falschen Rückgabewert erzeugt?

Nun, Sie sollten auf jeden Fall in die Welt des professionellen Debuggens mit Xdebug eintauchen, da es alle oben genannten Probleme lösen kann.


MAMP konfigurieren

Ich möchte nicht zu tief in den Download- und Installationsprozess von MAMP auf einem Mac eintauchen. Stattdessen werde ich Ihnen nur mitteilen, dass ich während dieses Lesens PHP 5.4.4 und den Standard-Apache-Port(80) verwende.


Ihre erste Entscheidung

Ein kurzer Hinweis, bevor wir mit dem Erstellen unseres eigenen Xdebugs über Homebrew beginnen: Wenn Sie den einfachsten Weg einschlagen möchten, wird MAMP bereits mit Xdebug 2.2.0 geliefert. Um es zu aktivieren, öffnen Sie:

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

Gehen Sie mit einem Texteditor Ihrer Wahl ganz nach unten und kommentieren Sie die letzte Zeile aus, indem Sie das ; entfernen.

Die letzten beiden Zeilen der Datei sollten folgendermaßen lauten:

Nun, wenn Sie sich fragen:

"Warum sollte ich einen schwierigeren Weg als diesen wählen wollen?"

Und meine Antwort darauf ist, dass es niemals ein Fehler ist, über den Rand hinauszuschauen und etwas Neues zu lernen. Gerade als Entwickler wird es heutzutage immer nützlich sein, ein Auge auf Server-bezogene Dinge zu werfen. Versprochen.


Installieren Sie die Xcode- und Befehlszeilentools

Sie können Apple Xcode kostenlos im Mac App Store erwerben. Nachdem Sie es heruntergeladen haben, gehen Sie zu den Anwendungseinstellungen, klicken Sie auf die Registerkarte "Downloads" und installieren Sie die "Befehlszeilentools" aus der Liste.


Installieren Sie Homebrew

Homebrew ist ein hübscher kleiner Paketmanager für Mac OS X, mit dem Sie alles bekommen, was Apple ausgelassen hat. Um Homebrew zu installieren, fügen Sie einfach den folgenden Befehl in Ihr Terminal ein.

Auf einem Mac ist Homebrew die bequemste Möglichkeit, Xdebug zu installieren. Unter Linux ist es jedoch am besten, es selbst zu kompilieren. Das ist auf einem Mac nicht so einfach.

Tipp: Windows-Benutzer müssen nur die *.dll-Datei von Xdebug.org herunterladen, in den XAMPP-Ordner legen und den Pfad zu ihrer php.ini-Datei hinzufügen.

Als PHP-Entwickler sollten Sie von nun an Jose Gonzalez '"Homebrew-PHP"-Github-Repo kennen, das viele nützliche "Biere" für Sie enthält. Wenn Sie sich jemals gefragt haben, wie Sie PHP 5.4 manuell installieren sollen, sind Sie hier genau richtig.

Wenn Sie bei der Installation von Homebrew auf Probleme stoßen, lesen Sie Jose's Readme.

Um unsere Homebrew-Exkursion abzuschließen, möchten wir die Brauformeln von Jose "antippen", indem wir die folgenden Befehle in Ihrer Terminalanwendung ausführen:

Dadurch erhalten wir einige Abhängigkeiten, die wir für Joses Formeln benötigen.

Getan! Jetzt sollten wir bereit sein, Xdebug bequem auf einem Mac zu installieren.


Installieren Sie Xdebug

Führen Sie in Ihrer Terminalanwendung Folgendes aus:

Wenn Sie mit PHP 5.3 arbeiten, ersetzen Sie einfach die "4" durch eine "3";)

Die Installation wird einige Zeit dauern. Nachdem dies erledigt ist, sehen Sie ein kleines Biersymbol und einige weitere Anweisungen, die Sie ignorieren können.

Also, was ist gerade passiert? Homebrew hat alle Dateien einschließlich ihrer Abhängigkeiten heruntergeladen und für Sie erstellt. Wie ich Ihnen bereits gesagt habe, kann das Kompilieren auf einem Mac ein Problem sein. Am Ende haben wir eine frisch kompilierte xdebug.so unter /usr/local/Cellar/php54-xdebug/2.2.1/.

Achtung: Bitte beachten Sie, dass Homebrew während des Vorgangs PHP 5.4 auf Ihrem System installiert. Dies sollte nichts beeinflussen, da es auf Ihrem System nicht aktiviert ist.

Um Xdebug endgültig zu installieren, müssen wir nur noch ein paar Schritte ausführen.

Wechseln Sie das Verzeichnis (cd) in den Erweiterungsordner von MAMP:

Sie können den Pfad erneut überprüfen, indem Sie sich die letzte Zeile von /Applications/MAMP/bin/php/php5.4.4/conf/php.ini ansehen, da wir hier hingehen.

Sichern Sie die vorhandene xdebug.so nur für den Fall:

Kopieren Sie dann Ihren Homebrew Xdebug-Build:

Wenn Sie einen Kopierbefehl (cp) zum Überschreiben vorhandener Dateien erzwingen möchten, führen Sie einfach cp -X source target aus.

Zu guter Letzt müssen wir die Datei php.ini ändern, um die Xdebug-Erweiterungsdatei zu laden. Öffnen Sie /Applications/MAMP/bin/php/php5.4.4/conf/php.ini mit einem Texteditor Ihrer Wahl, gehen Sie ganz nach unten und kommentieren Sie die letzte Zeile aus, indem Sie das Semikolon vorne entfernen. Schließen Sie die Datei noch nicht.

Starten Sie nun MAMP neu und gehen Sie zu http: //localhost/MAMP/phpinfo.php. Wenn alles gut gegangen ist, sollten Sie dies in der Ausgabe finden:

xdebug-in-phpinfoxdebug-in-phpinfoxdebug-in-phpinfo

Wenn es nicht funktioniert hat, stellen Sie bitte sicher, dass Sie wirklich über die Datei xdebug.so kopiert haben und den richtigen Pfad in Ihrer Datei php.ini haben.


Starten Sie das Debuggen

Bevor wir mit dem Debuggen beginnen können, müssen wir Xdebug aktivieren. Daher hoffe ich, dass Sie Ihre php.ini nicht geschlossen haben, da wir diese Zeile bis zum Ende nach der Option zend_extension hinzufügen müssen:

Speichern und schließen Sie Ihre php.ini-Datei und starten Sie MAMP neu. Gehen Sie erneut zu http: //localhost/MAMP/phpinfo.php und suchen Sie auf der Site nach xdebug.remote. Ihre Werte sollten genau wie meine aussehen:

xdebug-remote-in-phpinfoxdebug-remote-in-phpinfoxdebug-remote-in-phpinfo

Wenn dies nicht der Fall ist, gehen Sie genauso vor, wie Sie remote_enable = On für die anderen Anweisungen am Ende Ihrer Datei php.ini hinzugefügt haben.

Öffnen Sie nun die IDE Ihrer Wahl. Sie können Xdebug mit einer Reihe gängiger Softwarelösungen wie Eclipse, Netbeans, PhpStorm und auch Sublime Text verwenden. Wie ich bereits sagte, werde ich PhpStorm EAP 6 für diese Demo verwenden.

Öffnen Sie in PhpStorm die Anwendungseinstellungen und finden Sie den Weg zu "PHP\Debug\DBGp Proxy" auf der linken Seite, wie im folgenden Screenshot dargestellt:

phpstorm-debug-settingsphpstorm-debug-settingsphpstorm-debug-settings

Wählen Sie nun Ihren persönlichen IDE-Schlüssel. Dies kann eine beliebige alphanumerische Zeichenfolge sein. Ich nenne es lieber einfach PHPSTORM, aber XDEBUG_IDE oder myname wären auch vollkommen in Ordnung. Es ist wichtig, den Wert "Port" auf 9000 zu setzen, da unsere Standard-Xdebug-Konfiguration diesen Port verwendet, um eine Verbindung zur IDE herzustellen.

Tipp: Wenn Sie dies anpassen müssen, fügen Sie Ihrer Datei php.ini xdebug.remote_port = portnumber hinzu.

Achtung: Andere Komponenten können diesen Wert in PhpStorm ändern. Achten Sie daher darauf, wenn ein Fehler auftritt.

Klicken Sie anschließend auf die rote kleine Telefonschaltfläche mit einem kleinen Fehler in der oberen Symbolleiste. Es sollte grün werden. Dadurch wartet PhpStorm auf eingehende Xdebug-Verbindungen.

phpstorm-bug-phone

Jetzt müssen wir etwas zum Debuggen erstellen. Erstellen Sie eine neue PHP-Datei, nennen Sie sie wie Sie möchten und fügen Sie den folgenden Code ein:

Jetzt ist dieser Code standardmäßig falsch, aber wir werden ihn im nächsten Abschnitt gleich beheben.

Stellen Sie sicher, dass alles gespeichert ist, und öffnen Sie Ihren Browser für das gerade erstellte Skript. Ich werde Google Chrome für diese Demo verwenden, aber jeder Browser wird es tun.

Nehmen wir uns jetzt einen Moment Zeit, um zu verstehen, wie der Debugging-Prozess initialisiert wird. Unser aktueller Status lautet: Xdebug als Zend-Erweiterung aktiviert und wartet auf port 9000 darauf, dass während einer Anforderung ein Cookie angezeigt wird. Dieses Cookie enthält einen IDE-Schlüssel, der mit dem in unserer IDE eingerichteten identisch sein sollte. Wenn Xdebug das Cookie sieht, das die Anforderung enthält, wird versucht, eine Verbindung zu einem Proxy, unserer IDE, herzustellen.

Wie bringen wir diesen Cookie an Ort und Stelle? PHPs setcookie? Nein. Obwohl es mehrere Möglichkeiten gibt, auch einige, um dies ohne Cookie zum Laufen zu bringen, werden wir eine kleine Browser-Erweiterung als Hilfsmittel verwenden.

Installieren Sie den "Xdebug-Helfer" in Ihrem Google Chrome-Browser oder suchen Sie nach einer Erweiterung, die dies für den von Ihnen verwendeten Browser ermöglicht.

Sobald Sie die Erweiterung installiert haben, klicken Sie mit der rechten Maustaste auf den kleinen Fehler in Ihrer Adressleiste und gehen Sie zu den Optionen. Konfigurieren Sie den Wert für den IDE-Schlüssel so, dass er mit dem in Ihrer IDE ausgewählten Schlüssel übereinstimmt:

xdebug-browser-extensionxdebug-browser-extensionxdebug-browser-extension

Klicken Sie nach der Konfiguration auf den Fehler und wählen Sie "Debug" aus der Liste aus. Der Fehler sollte grün werden:

xdebug-browser-extension-active

Kehren Sie nun zu PhpStorm oder der IDE Ihrer Wahl zurück und legen Sie einen "Haltepunkt" fest. Haltepunkte sind wie Markierungen in einer Zeile, die den Debugger anweisen, die Ausführung des Skripts an diesem Haltepunkt anzuhalten.

In PhpStorm können Sie einfach Haltepunkte hinzufügen, indem Sie auf das Leerzeichen neben den Zeilennummern auf der linken Seite klicken:

phpstorm-breakpointphpstorm-breakpointphpstorm-breakpoint

Versuchen Sie einfach zu klicken, wo der rote Punkt auf dem Screenshot erscheint. Sie haben dann einen Haltepunkt festgelegt, an dem Ihr Skript angehalten werden soll.

Hinweis: Sie können mehrere Haltepunkte in so vielen Dateien haben, wie Sie möchten.

Jetzt sind wir alle bereit. Kehren Sie zu Ihrem Browser zurück, stellen Sie sicher, dass der Fehler grün ist, und laden Sie die Seite neu, um das Cookie bei der nächsten Anforderung zu senden.

Tipp: Wenn Sie ein Cookie setzen, ist es für die nächste Anfrage verfügbar.

Wenn alles nach Plan verläuft, sollte dieses Fenster in PhpStorm angezeigt werden, um Sie über eine eingehende Debug-Verbindung zu informieren:

phpstorm-incoming-debug-connectionphpstorm-incoming-debug-connectionphpstorm-incoming-debug-connection

Ist das Fenster für Sie nicht aufgetaucht? Lassen Sie uns eine Fehlerbehebung durchführen und wiederholen, was eingestellt werden muss, damit dies erfolgreich ist:

  1. Sie sollten Xdebug-Informationen in der Ausgabe von phpinfo() finden. Wenn nicht, holen Sie sich die Datei xdebug.so an die richtige Stelle und richten Sie Ihre Datei php.ini ein.
  2. Stellen Sie die PhpStorm DBGp-Einstellungen auf Ihren IDE-Schlüssel ein, z. B. "PHPSTORM" und Port "9000".
  3. Lassen Sie PhpStorm auf eingehende Debug-Verbindungen warten, indem Sie das rote Telefonsymbol verwenden, das dann grün wird.
  4. Legen Sie einen Haltepunkt in Ihrem Code fest oder wählen Sie "Run \ Break in der ersten Zeile in PHP-Skripten", um unabhängig von Haltepunkten zu sein. Beachten Sie, dass dies nicht für den praktischen Gebrauch geeignet ist.
  5. Holen Sie sich eine Browser-Erweiterung, um das Xdebug-Cookie zu setzen.
  6. Stellen Sie sicher, dass die Browsererweiterung denselben IDE-Schlüssel enthält, den Sie in Ihrer IDE ausgewählt haben.
  7. Laden Sie die Seite neu und PhpStorm sollte die Verbindung herstellen.

Wenn Sie den Dialog auf dem vorherigen Bild sehen, akzeptieren Sie ihn bitte. Dadurch gelangen Sie wie folgt in den Debug-Modus:

phpstorm-in-debug-modephpstorm-in-debug-modephpstorm-in-debug-mode

Sie können sehen, dass der Debugger die Ausführung des Skripts an Ihrem Haltepunkt gestoppt und die Linie blau hervorgehoben hat. PHP wartet jetzt und wird von Xdebug gesteuert, das von nun an von Ihren eigenen Händen gesteuert wird.

Unser Hauptarbeitsbereich wird der untere Bereich der IDE sein, in dem bereits einige Informationen zum laufenden Skript (den Superglobalen) angezeigt werden.

phpstorm-debugger-varsphpstorm-debugger-varsphpstorm-debugger-vars

Und würdest du dir das ansehen? Es gibt den Cookie, den wir gerade gesetzt haben, um die Debugging-Sitzung zu starten. Sie können jetzt durch die Superglobalen klicken und ihre Werte in diesem Moment überprüfen. PHP wartet, es gibt kein Zeitlimit, zumindest nicht die Standard 30 Sekunden.

Auf der linken Seite sehen Sie einige Schaltflächen. Derzeit sind für uns nur "Play" und "Stop" von Interesse. Die grüne Wiedergabetaste setzt das Skript fort. Wenn der Code einen anderen Haltepunkt enthält, wird das Skript fortgesetzt, bis es den Haltepunkt erreicht, und erneut angehalten.

Die rote Stopptaste bricht das Skript ab. Genau wie es PHPs exit oder die tun würde.

phpstorm-debugger-play-stop

Jetzt kommen die wirklich interessanten im oberen Bereich des Debug-Fensters:

phpstorm-debugger-controlsphpstorm-debugger-controlsphpstorm-debugger-controls

Lassen Sie uns sie schnell überprüfen:

  1. Step Over: Dies bedeutet, dass Sie eine Zeile voraus sind.
  2. Step Into: Wenn die blaue Linie beispielsweise einen Funktionsaufruf hervorhebt, können Sie mit dieser Schaltfläche einen Einblick in die Erkenntnisse der Funktion erhalten.
  3. Step Out: Wenn Sie in eine Funktion eingetreten sind und vor Erreichen des Endes aussteigen möchten, treten Sie einfach aus.
  4. Run to cursor: Nehmen wir an, Ihre Datei ist beispielsweise 100 Zeilen lang und Ihr Haltepunkt wurde in Zeile zwei festgelegt, um etwas zu überprüfen. Jetzt möchten Sie schnell zu dem Punkt laufen, an dem Sie gerade auf den Cursor geklickt haben - diese Schaltfläche ist für Sie. Sie können auch n-mal auf "Step over" klicken;)

Machen Sie sich jetzt keine Sorgen, wenn Sie Xdebug verwenden, werden Sie sich schnell an die Verknüpfungen auf der Tastatur anpassen.


Einen Beispielcode tatsächlich debuggen

Ich habe Ihnen bereits gesagt, dass der Code, den Sie kopieren / einfügen, falsch ist, daher müssen Sie ihn debuggen. Beginnen Sie, den Code Anweisung für Anweisung zu überschreiten.

Beachten Sie, dass die blaue Linie nur in Zeilen angehalten wird, die tatsächlich einen Befehl enthalten. Leerzeichen und Kommentare werden übersprungen.

Wenn Sie den Funktionsaufruf von loadData erreicht haben, treten Sie bitte nicht ein, sondern gehen Sie einfach über die if-Anweisung und halten Sie an.

phpstorm-debugger-you-cant-go-backphpstorm-debugger-you-cant-go-backphpstorm-debugger-you-cant-go-back

Sie können zwei neue Variablen im Bereich "Variablen" am unteren Bildschirmrand sehen. Warum hat die Variable $data nun false zurückgegeben? Es scheint, als hätte das Skript seine Arbeit erledigen sollen. Lass uns mal sehen. Gehen Sie zurück zu Zeile sieben, um in den Funktionsaufruf einzusteigen -> bam! Wir erhalten eine Nachricht, die uns darüber informiert, dass wir nicht "zurücktreten" können. Damit Ihr Debugger wieder in Zeile sieben steht, müssen Sie diese Sitzung beenden und die Seite im Browser neu laden. Tun Sie dies und treten Sie diesmal in den Funktionsaufruf ein.

Stoppen Sie die return-Anweisung innerhalb der loadData-Funktion und sehen Sie, was passiert ist:

phpstorm-debugger-in-a-functionphpstorm-debugger-in-a-functionphpstorm-debugger-in-a-function

Das Array $phpData ist leer. Die return-Anweisung verwendet einen ternären Operator, um zu ermitteln, was zurückgegeben werden soll. Und es wird false für ein leeres Array zurückgeben.

Korrigieren Sie die Zeile, um zu sagen:

Da json_decode bei einem Fehler entweder die Daten zurückgibt oder null zurückgibt. Beenden Sie nun die Debug-Sitzung, laden Sie Ihren Browser neu und gehen Sie diesmal über den Funktionsaufruf.

phpstorm-debugger-still-falsy-dataphpstorm-debugger-still-falsy-dataphpstorm-debugger-still-falsy-data

Jetzt scheint es, als hätten wir immer noch ein Problem, als wir in den Zustand eintreten. Bitte korrigieren Sie die Bedingung, um mit is_null() zu erkennen, was los ist:

Jetzt liegt es an Ihnen, ein bisschen herumzutreten. Ich würde vorschlagen, das Skript auf die ursprüngliche Falsy-Version zurückzusetzen, es mit echos zu debuggen und dann zu vergleichen, wie sich das im Vergleich zur Verwendung von Xdebug anfühlt.


Schlussfolgerung

In diesem Artikel sollten Sie viel neues Wissen erworben haben. Zögern Sie nicht, es noch einmal zu lesen und einem Freund bei der Einrichtung von Xdebug zu helfen - nichts Besseres als das!

Möglicherweise möchten Sie versuchen, Ihr übliches Debug-Verhalten durch die Verwendung von Xdebug zu ersetzen. Besonders bei größeren, objektorientierten Projekten, da sie viel einfacher zu debuggen sind und sogar den Fluss aufholen, wenn Sie nicht sofort etwas bekommen.

Beachten Sie, dass dies nur die Spitze des Eisbergs ist. Xdebug bietet viel mehr Leistung, die ebenfalls erforscht werden muss.

Bitte zögern Sie nicht, Fragen in den Kommentaren zu stellen und lassen Sie mich wissen, was Sie denken.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.