Skip to content

Flow Framework mit XDebug-Proxy

Ich hatte kürzlich mit einem Projekt auf Basis des Flow Frameworks zu tun. Zu den Besonderheiten dieses PHP-Frameworks gehört unter anderem die Unterstützung von Aspect-Oriented Programming (AOP), mithilfe dessen sich generische Funktionalitäten relativ sauber über verschiedene Klassen hinweg verwenden lassen (cross-cutting concerns). Wie das funktioniert, ist in der Dokumentation ausführlich beschrieben.

Zu diesem Zweck erstellt Flow automatisch Proxy-Klassen, welche die Original-Klassen erweitern und die nicht zuletzt aus Performance-Gründen gecachet werden. Dabei werden gegebenenfalls Aspekte, Pointcuts oder Advices in Klassen "eingewoben". Die Applikation verwendet die auf diese Weise generierten Klassen, in der Entwicklung wird aber weiterhin nur mit den Originalen gearbeitet.

Ein bedeutender Nachteil dieser Vorgehensweise ist, dass Debugging - z.B. mit XDebug - nicht mehr ohne Weiteres möglich ist, denn die IDE kennt nur die Original-Klassen, nicht aber die dynamisch erstellten Proxy-Klassen. Um dieses Problem zu lösen, wurde flow-debugproxy geschreiben, ein Flow Framework Debug-Proxy for XDebug in Go, der die Proxy-Klassen auf die Original-Klassen "mappt".

Da dieser Proxy nicht ganz trivial zu installieren ist, habe ich hier eine kurze Anleitung aufgeschrieben, die in dem genannten Projekt funktioniert hat (und mir nebenbei eine Kiste Bier eingebracht hat ;-)):

Vagrant Box

Xdebug

Falls Xdebug auf der Vagrant Box noch nicht installiert und eingrichtet ist:

$ sudo apt install php-xdebug -y
$ sudo vim /etc/php/7.0/mods-available/xdebug.ini
zend_extension=xdebug.so
xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.idekey=PHPSTORM
$ sudo phpenmod xdebug
$ sudo service apache2 restart

Installation von flow-debugproxy

flow-debugproxy ist ein XDebug-Proxy, der in Go geschrieben ist und sich um das Mapping zwischen den eigentlichen PHP-Klassen und den Proxy-Klassen kümmert.

Update 29.06.2017: Wie Karsten in den Kommentaren angemerkt hat, gibt es seit kurzem fertige Binaries von flow-debugproxy, sodass die Installation von Golang und der Build-Schritt entfallen können. Vielen Dank für den Hinweis!

Das Tool lässt sich wie folgt auf der Vagrantbox installieren:

$ sudo apt install golang -y
$ export GOPATH=$HOME/go
$ cd
$ git clone https://github.com/dfeyer/flow-debugproxy.git
$ cd flow-debugproxy/
$ go get
$ go build

GOPATH kann relativ beliebig(?) gesetzt werden, siehe https://github.com/golang/go/wiki/GOPATH.

Starten von flow-debugproxy

$ cd /var/www/example
$ ~/flow-debugproxy/flow-debugproxy --framework flow --context Development\Vagrant

Wer möchte, kann sich dafür ein Startup-Skript basteln, z.b. eine systemd-Service Unit.

Lokaler Rechner (Host)

Remote Port Forwarding auf dem Host

Wenn ich das richtig sehe, lässt sich über das Vagrantfile kein Remote Port Forwarding einrichten (über die Einstellung von Virtualbox geht das möglicherweise?), sondern nur ein "normales" Port Forwarding. Daher muss man sich selbst um den Tunnel kümmern:

$ ssh vagrant@example.local -p 22 -R 9010:localhost:9019

Konfiguration von PhpStorm

Settings > Languages & Frameworks > PHP > Debug > Xdebug > Debug port auf 9019 setzen, Can accept external connections muss aktiv sein.

Jetzt lassen sich in PhpStorm Breakpoints setzen, und die IDE sollte die eingehende Debug-Verbindung entsprechend behandeln.

Ich hoffe, ich habe keinen Schritt vergessen, und die Anleitung hilft vielleicht der einen oder dem anderen. In diesem Fall würde ich mich über einen kurzen Kommentar sehr freuen :-)

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Karsten am :

Karsten

Mittlerweile (seit 1.0.1) gibt es fertige Binaries des Proxy, siehe https://github.com/dfeyer/flow-debugproxy/releases – das macht die Installation einfacher.

Matthias Gutjahr am :

Matthias Gutjahr

Vielen Dank für den Hinweis! Ich habe den Post entsprechend aktualisiert. Das erleichtert die Installation erheblich.

Dass bei Golang fertige Binaries rauspurzeln, ist IMHO einer der zahlreichen Pluspunkte dieser Sprache.

Kommentar schreiben

Markdown-Formatierung erlaubt
Wenn Du Deinen Twitter Namen eingibst wird Deine Timeline in Deinem Kommentar verlinkt.
Bewirb einen Deiner letzten Artikel
Dieses Blog erlaubt Dir mit Deinem Kommentar einen Deiner letzten Artikel zu bewerben. Bitte gib Deine Blog URL als Homepage ein, dann wird eine Auswahl erscheinen, in der Du einen Artikel auswählen kannst. (Javascript erforderlich)
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss, um dieses Verfahren anzuwenden.
CAPTCHA

Formular-Optionen

Kommentare werden erst nach redaktioneller Prüfung freigeschaltet!