[megoldva] vs-code/phpstorm, docker, xdebug

Régebben használtam az xdebugot php-hoz, és gondoltam, hogy az Ubuntu alatt jól futó code alatt is megpróbálom beüzemelni, dockeren futó webalkalmazáshoz, de egy rémálom.

Mintha mindkét főhős (code és docker) a 0.0.0.0:9000-et akarná használni, és amelyiket később indítom el (a code és a docker közül), az panaszkodik, hogy "EADDRINUSE: 9000", vagyis hogy a port már foglalt.

Gyanús mondjuk, hogy a Google Chrome-hoz tartozó xdebug plugin nem tartalmazza a beállítási legördülőmenüjében a code-ot, csak egyebeket (pl. PhpStorm).

Szerk: PhpStorm-mal is ugyanez volt a helyzet, amelyik portot beállítottam a dockerben, arra mondta a PhpStorm (is), hogy ... port is busy.

php-fpm-et használok, de nem a 9000-es porton, hanem unix:/var/run/php/php7.2-fpm.sock socketen.

Megoldás:

Itt találtam releváns segítséget: https://dev.to/brpaz/docker-phpstorm-and-xdebug-the-definitive-guide-14… - és az ehhez kapcsolódó github példában: https://github.com/brpaz/symfony-docker-xdebug-demo

Fantasztikusan egyszerű ez a .env fájl sor:

XDEBUG_CONFIG="default_enable=1 remote_enable=1 remote_port=9001 remote_handler=dbgp remote_connect_back=1 remote_autostart=1 idekey=PHPSTORM"

Nagyságrendekkel egyszerűbb, mint a https://derickrethans.nl/xdebug-experience.html utolsó posztjában vázolt szkriptes cserebere.

Segített ez a kis példa is, hogy felfogjam, hogy is van itt ez az xdebug kliens ügy: https://github.com/bufferings/docker-access-host - leginkább ez az ötlet jött jól, ahogy lehet tesztelni ip+port-ot: curl -sS host.docker.internal:8888 (merthogy pinggel ilyet nem tudok).

Kiegészítés:

Az api debuggolásához utánajártam a wireshark parancsori megfelelőjének: tshark, ami elindítható docker entitáson belül is. (Merthogy a gond az, hogy nem jönnek ki onnan az adatcsomagok, s így nem nézhetőek meg pl. burp-ben vagy xdebuggal a szerkesztőben.)
Eleinte reflexszerűen a -i eth0 interfészt figyeltem, tévesen. Inkább a "lo" figyelendő. Ez adott eredményt (verbose üzemmódban): tshark -i lo -V > checkme
Ez aztán full extrásan mutat mindent, ami gyüszmékel ott a hívások során.
 

Hozzászólások

Nálam az alábbi működik php:7.2-apache image és pecl-ből telepített xdebug mellett. VSCode-ban telepítve van a PHP Debug extension.

PHP xdebug.ini a dockeren belül:

xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_connect_back=0
xdebug.remote_host=host.docker.internal
xdebug.idekey=VSCODE
xdebug.remote_autostart=1

VSCode launch.json a projekt .vscode mappájában:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "log": true,
            "externalConsole": false,
            "pathMappings": {
                "/var/www/html": "${workspaceRoot}",
            },
            "ignore": [
                "**/vendor/**/*.php"
            ]
        }
    ]
}

Használat: VSCode-ban F5 (Start Debugging), majd böngészőben php meghív.

(A VSCode indít egy debug szervert a hoszt gép 9000-es portján, amihez a dockeren belül futó xdebug kapcsolódik.)

Az IDE és az xdebug között szerver-kliens kapcsolat van. Csak a VSCode-nak kell a hoszt gépen a 9000-es portra bindelnie (ezt csinálja a PHP Debug extension), a docker konténeren belül semminek, az kliensként csatlakozik.

A fenti megoldásban az a király, hogy semmi plusz böngésző plugint vagy egyebet nem kell telepíteni, működik bármelyikből, illetve elvileg parancssori php szkripteket is tudsz így debugolni vele.

Szerkesztve: 2019. 11. 19., k – 07:34

Ilyen kombinációban nem használtam, de nekem is volt már hasonló problémám.
Úgy emlékszem egyszerűen csak átraktam az xdebug-ot a 9001-re.
Persze írtad hogy az fpm-et socket-en keresztül használod, de valahogy valami akkor is fogja 

xdebug.remote_port = 9001
Szerkesztve: 2019. 12. 08., v – 11:17

Lett itt még egy gondom.

Ez a yii2 alkalmazás, amit debuggolni próbálok, időnként megszólítja a saját API-ját (ami a backend.valami helyett api.valami, de az IP címe ugyanaz, helyi).

Ezeknek az API POST-hívásoknak a debuggerrel való elkapása gondot okoz. Talán mert ezek a hívások ki sem jönnek a docker entitásból? Nem tudom.

Ha GET-tel hívom, és magát a GET hívást berakom egy böngészőbe, akkor persze elkapja, de POST-tal nem.

(Próbáltam Burp-pal is elcsípni, de az se lát be a dockerbe.)