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
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt
Karsten am :
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 :
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.