Aus irgendeinem Grund empfängt PHPStorm die Debug-Verbindung nicht, wenn von einem Remote-Host auf den Webserver zugegriffen wird. PHPStorm verhält sich, als würde es überhaupt nicht zuhören. Wenn ich vom gleichen Host auf den Webserver zugreife, wird die Debug-Verbindung akzeptiert und sie bricht in der ersten Zeile ab, was das erwartete Verhalten ist.
Mein aktuelles Setup:
Host-Rechner: Windows 10 PRO, Chrome-Browser, Firewall deaktiviert (zu Testzwecken)
Gastmaschine: Ubuntu 18.04 auf einer Hyper-v-VM auf dem Hostcomputer installiert
Auf dem Gastcomputer habe ich Docker installiert, auf dem die folgenden Container ausgeführt werden:
- php-fpm 7.2.16
- apache-httpd 2.4
PHP-FPM ist so konfiguriert, dass es Port 9000 verwendet, während XDEBUG 9009 verwendet.
PHP-Konfiguration:
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9009
Apache fcgi-Konfiguration:
<IfModule proxy_fcgi_module>
<Proxy "fcgi://${PHP_SERVER_NAME}:${PHP_SERVER_FCGI_PORT}" enablereuse=on max=10>
</Proxy>
<FilesMatch "\.php$">
SetHandler "proxy:fcgi://${PHP_SERVER_NAME}:${PHP_SERVER_FCGI_PORT}"
</FilesMatch>
PHPStorm ist auf dem Ubuntu-Gastcomputer installiert.
Um es zusammenzufassen:
Beim Zugriff auf die Website von Chrome/Firefox auf dem Gastcomputer empfängt PHPStorm die Verbindung und bricht wie erwartet ab.
Wenn Sie vom Hostcomputer aus genau dasselbe tun, wird die Website gerendert, ohne dass PHPStorm die Verbindung akzeptiert.
Meine Frage lautet also: Was könnte die Ursache dafür sein, dass beim Zugriff vom Host aus keine Debug-Verbindung hergestellt wird?
Antwort1
Das Ersetzen xdebug.remote_connect_back
durch xdebug.remote_host
scheint das Problem zu lösen.
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_host = IP_OF_HOST_RUNNING_PHPSTORM
xdebug.remote_port = 9009
Nach meinem Verständnis hat remote_connect_back aus folgendem Grund nicht funktioniert:
Wenn aktiviert, wird die Einstellung xdebug.remote_host ignoriert und Xdebug versucht, eine Verbindung mit dem Client herzustellen, der die HTTP-Anforderung gestellt hat. Es prüft die Variablen $_SERVER['HTTP_X_FORWARDED_FOR'] und $_SERVER['REMOTE_ADDR'], um herauszufinden, welche IP-Adresse verwendet werden soll.
Wenn xdebug.remote_addr_header konfiguriert ist, wird die Variable $SERVER mit dem konfigurierten Namen vor den Variablen $_SERVER['HTTP_X_FORWARDED_FOR'] und $_SERVER['REMOTE_ADDR'] überprüft.
Der Debugger sendet also xdebug.remote_connect_back
die Debug-Verbindung an die IP des REQUESTER, der in diesem Fall der HOST und nicht der GUEST war.