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:
VSCode launch.json a projekt .vscode mappájában:
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.)
Köszi! És a docker ps mit mond? 0.0.0.0-hoz mutatja a portokat?
0.0.0.0:80->80/tcp, 443/tcp, 0.0.0.0:9000->9000/tcp ? (Illetve próbáltam úgy is, hogy dockeren 9001->9000 legyen, IDÉ-ben 9001, de nem nyert.)
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.
Köszi. Azt hittem, valahogy átjárhatóvá kell tenni a 9000-es portot a docker entitáson, mert különben nem jut be/ki adat.
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
Köszi! Próbáltam így (hogy mindkét helyen, xdebug-ban is és az IDÉ-ben is átállítottam 9001-re vagy akár 9009-re), de nem jártam sikerrel, megint csak ütközés volt.
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.)