Auf Wunsch hier nochmal eine kleine Anleitung wie man Xdebug in einem Docker-Container zusammen mit PHPStorm verwendet. Ich hatte ja schon eine Anleitung für VSCode geschrieben und dort am Ende angemerkt, dass es mit PHPStorm sehr viel einfacher geht. Vorhin nochmal getestet und es geht sehr viel einfacher.
Aber von Anfang an. Wir müssen erstmal das Docker-Image um Xdebug erweitern:
RUN pecl install xdebug-2.8.0 && docker-php-ext-enable xdebug
RUN echo 'zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so"' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.remote_port=9000' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.remote_enable=1' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.remote_host=host.docker.internal' >> /usr/local/etc/php/php.ini
Dann installieren wir uns "Xdebug Helper" für den Chrome oder eben die Kombination aus Addon und Browser, die man gerne hätte.
Dann den Docker-Container starten. Die Seite im Chrome aufrufen und dort das Addon aktivieren. Einen Breakpoint in PHPStorm setzen und PHPStorm auf Debug Eingänge horchen lassen.
F5 im Webbrowser drücken und dann das Mapping bestätigen.
Das wars. Super einfach und schnell (abgesehen vom Docker-Container bauen) eingerichtet.
Es war ein harter Kampf.. aber ich war siegreich. Nachdem ich durch den Wechsel meines Arbeitgebers auch den Zugriff auf Intellij + PHP-Plugin einbüßen musste, bin ich jetzt vollständig auf VSCode gewechselt.
Wie ich XDebug + VSCode + Docker zum Laufen bekommen habe.
Dockerfile (nur der wichtige Teil):
RUN pecl install xdebug-2.8.0 && docker-php-ext-enable xdebug
RUN echo 'zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so"' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.remote_port=9000' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.remote_enable=1' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.remote_host=host.docker.internal' >> /usr/local/etc/php/php.ini
Lokale php.ini (ich habe 2.8.0 herunter geladen und als php_xdebug.dll gespeichert):
zend_extension=c:\php\ext\php_xdebug.dll
#.....
[XDebug]
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
Dann habe ich dieses Plugin in VSCode installiert. Mit Hilfe dieses Boilerplate-Projekts habe ich mir eine passende .vscode/launch.json gebaut.
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 9000,
"pathMappings": {
"/var/www/html": "${workspaceFolder}/"
},
"xdebugSettings": {
"max_data": 65535,
"show_hidden": 1,
"max_children": 100,
"max_depth": 5
}
}
]
}
Dann VSCode neugeladen. Docker gestartet und in die Debug-Ansicht von VSCode gewechselt.
Dort das ""Listen for XDebug" Profile starten und es sollte funktionieren.
PHPStorm/Intellij ist da viel einfacher, weil man nicht selbst noch JSON-Dateien anlegen und editieren muss. Aber es läuft!
Es klingt sehr viel komplizierter als es man Ende ist. Das Wichtigste ist es erst einmal XDebug auf der VM zu installieren. Ich habe da PHP7.1 und es erklärt sich an sich von selbst:
apt-get install php7.1-xdebug
Danach muss die /etc/php/7.1/mods-available/xdebug.ini bearbeitet werden. Wenn man nun davon ausgeht, dass die VM mit VirtualBox und einem Host-only Netzwerk in den Standard Einstellungen läuft ist der Host 192.168.56.1 . Die Datei sieht dann also so aus:
zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_host=192.168.56.1
xdebug.remote_port=9000
Bei mit zeigt shopware.localhost auf die VM und auf eine Shopware-Installation. Einen Breakpoint habe ich ganz an den Anfang von der shopware.php gesetzt.
Im Firefox verwendet ich das Addons Xdebug Session Cookie. PHPStorm hört auf Port 9000 nach Debug-Verbindungen. Wenn man nun shopware.localhost aufruft und das Addon aktiviert, wird auch sofort in PHPStorm dieses erkannt und er stoppt beim ersten Breakpoint, den man gesetzt hat.
Ist also in wenigen Minuten machbar, das für seine lokale Umgebung einzurichten.
Etwas komplexer ist es mit SSH und Portweiterleitungen, was aber ermöglicht ganz sicher ein Live- oder Staging-System zu debuggen und man muss nicht auf dem Server mit VI und echo/var_dump arbeiten, um heraus zu finden warum es zwar lokal super lief, aber nicht auf dem Server, obwohl die an sich total gleich sind. Kennt jeder.. oder?