Zum Inhalt

Xdebug

Xdebug ist eine PHP-Erweiterung, die Entwicklern bei der Arbeit unter die Arme greift. Sie wird von PhpStorm unterstützt.

Debugging

Mit einem interaktiven Debugger kann man schrittweise die Ausführung eines Programms nachvollziehen und dadurch unerwartetes Verhalten aufspüren. Um PhpStorms Integration mit dem Debugger von Xdebug nutzen zu können müssen folgende Schritte ausgeführt werden.

Kommandozeile

  1. Setze Breakpoints
  2. Run > Start Listening for PHP Debug Connections
  3. export PHP_IDE_CONFIG=serverName=php XDEBUG_MODE=debug XDEBUG_SESSION=1
  4. Führe je nach PHP-Interpreter den zu debuggenden Befehl aus:
    • php ...
    • bin/php ...
    • bin/ptr exec php ...

Manuelle HTTP-Abfrage

  1. Setze Breakpoints
  2. Run > Start Listening for PHP Debug Connections
  3. Bereite HTTP-Abfrage vor
  4. Füge Parameter XDEBUG_SESSION=1 zur Abfrage hinzu (s.u.)
  5. Schicke HTTP-Abfrage ab

Der Parameter XDEBUG_SESSION kann bei der HTTP-Abfrage auf verschiedene Weisen Übergeben werden.

GET /index.php
Cookie: XDEBUG_SESSION=1; ...

...

GET-Parameter

GET /index.php?XDEBUG_SESSION=1&...

...

POST-Parameter

POST /index.php
Content-Type: application/x-www-form-urlencoded

XDEBUG_SESSION=1&...

Webbrowser

  1. Installiere Xdebug-Browser-Erweiterung
  2. Setze Breakpoints
  3. Bereite HTTP-Abfrage im Browser vor (fülle Formular aus usw.)
  4. Aktiviere Xdebug-Debugging in der Werkzeugleiste des Browsers
  5. Run > Start Listening for PHP Debug Connections
  6. Schicke HTTP-Abfrage im Browser ab

Profiling

Mit einem Profiler lässt sich der Speicher- und Zeitverbrauch eines Programms aufzeichnen. Dadurch können Performance-Probleme lokalisiert werden. Um PhpStorms Integration mit dem Profiler von Xdebug nutzen zu können müssen folgende Schritte ausgeführt werden. Alternative zu PhpStorm kann auch das Programm KCachegrind zur Analyse genutzt werden.

Kommandozeile

  1. export XDEBUG_MODE=profile XDEBUG_PROFILE=1
  2. Führe je nach PHP-Interpreter den zu profilenden Befehl aus:
    • php ...
    • bin/php ...
    • bin/ptr exec php ...
  3. Kopiere gegebenenfalls die Profiling-Datei vom Container zum Host:
    • Finde den Dateinamen, der mit cachegrind.out. beginnt: bin/ptr exec ls /tmp
    • docker container cp "$(docker-compose ps -q php):/tmp/..." /tmp
  4. Öffne die Datei in PhpStorm: Tools > Analyze Xdebug Profiler Snapshot…

Manuelle HTTP-Abfrage

  1. Bereite HTTP-Abfrage vor
  2. Füge Parameter XDEBUG_PROFILE=1 zur Abfrage hinzu (s.u.)
  3. Schicke HTTP-Abfrage ab

Der Parameter XDEBUG_PROFILE kann bei der HTTP-Abfrage auf verschiedene Weisen Übergeben werden.

GET /index.php
Cookie: XDEBUG_PROFILE=1; ...

...

GET-Parameter

GET /index.php?XDEBUG_PROFILE=1&...

...

POST-Parameter

POST /index.php
Content-Type: application/x-www-form-urlencoded

XDEBUG_PROFILE=1&...

Webbrowser

  1. Installiere Xdebug-Browser-Erweiterung
  2. Bereite HTTP-Abfrage im Browser vor (fülle Formular aus usw.)
  3. Aktiviere Xdebug-Profiling in der Werkzeugleiste des Browsers
  4. Schicke HTTP-Abfrage im Browser ab
  5. Kopiere gegebenenfalls die Profiling-Datei vom Container zum Host:
    • Finde den Dateiname, der mit cachegrind.out. beginnt: bin/ptr exec ls /tmp
    • docker container cp "$(docker-compose ps -q php):/tmp/..." /tmp
  6. Öffne die Datei in PhpStorm: Tools > Analyze Xdebug Profiler Snapshot…

Tracing

Mit Tracing wird der Ablauf eines Programms aufgezeichnet. Damit kann man nachvoll ziehen wer wen wann aufruft. Um den Tracer von Xdebug nutzen zu können müssen folgende Schritte ausgeführt werden.

Kommandozeile

  1. export XDEBUG_MODE=trace XDEBUG_TRACE=1
  2. Führe je nach PHP-Interpreter den zu tracenden Befehl aus:
    • php ...
    • bin/php ...
    • bin/ptr exec php ...
  3. Kopiere gegebenenfalls die Trace-Datei vom Container zum Host:
    • Finde den Dateiname, der mit trace. beginnt: bin/ptr exec ls /tmp
    • docker container cp "$(docker-compose ps -q php):/tmp/..." /tmp
  4. Öffne die Datei in PhpStorm: File > Open…

Manuelle HTTP-Abfrage

  1. Setze Breakpoints
  2. Run > Start Listening for PHP Debug Connections
  3. Bereite HTTP-Abfrage vor
  4. Füge Parameter XDEBUG_TRACE=1 zur Abfrage hinzu (s.u.)
  5. Schicke HTTP-Abfrage ab

Der Parameter XDEBUG_TRACE kann bei der HTTP-Abfrage auf verschiedene Weisen Übergeben werden.

GET /index.php
Cookie: XDEBUG_TRACE=1; ...

...

GET-Parameter

GET /index.php?XDEBUG_TRACE=1&...

...

POST-Parameter

POST /index.php
Content-Type: application/x-www-form-urlencoded

XDEBUG_TRACE=1&...

Webbrowser

  1. Installiere Xdebug-Browser-Erweiterung
  2. Bereite HTTP-Abfrage im Browser vor (fülle Formular aus usw.)
  3. Aktiviere Xdebug-Tracing in der Werkzeugleiste des Browsers
  4. Schicke HTTP-Abfrage im Browser ab
  5. Kopiere gegebenenfalls die Trace-Datei vom Container zum Host:
    • Finde den Dateinamen, der mit trace. beginnt und mit .xt endet: bin/ptr exec ls /tmp
    • docker container cp "$(docker-compose ps -q php):/tmp/..." /tmp
  6. Öffne die Datei in PhpStorm: File > Open…

Flame Graph

Ein Flame Graph ist eine nützliche Visualisierung eines Traces. Man kann sie wie folgt erstellen.

  1. Erstelle eine Trace-Datei wie oben beschrieben mit der zusätzlichen Option -dxdebug.trace_format=1
  2. git clone https://github.com/BIG5Concepts/FlameGraph.git
  3. cd FlameGraph
  4. ./stackcollapse-xdebug.php /path/to/trace.NUMMER.xt | ./flamegraph.pl > /path/to/OUTPUT.svg

Die erzeugte SVG-Datei kann man dann mit einem Webbrowser öffnen. Die Grafik ist interaktiv. Durch klicken auf einen Abschnitt kann man heranzoomen.