Fizetési módok Abuse

Xdebug konfigurálása a PHPStormban

07.05.2021, 22:28

A hibakeresés az egyik legfontosabb folyamat a programozásban. A hibakereső segítségével láthatjuk, hogy mi történik a programban, milyen függvények kerülnek végrehajtásra, mi van a változókban tárolva, valamint lépésről lépésre végrehajthatunk mindent, és pontosan megérthetjük, hogy melyik sorban és a változók milyen értékeinél lép fel hiba.

A PHP-hoz például az Xdebug debuggert használják, a PHPStorm az egyik legnépszerűbb fejlesztőkörnyezet. A következőkben megnézzük, hogyan konfigurálhatjuk az Xdebugot a PhpStormban a hibakereséshez a helyi számítógépen és a Dockerben.

Az XDEBUG konfigurálása a PHPSTORM-ban

Beszéljünk arról, hogyan történik a hibakeresés a helyi szerveren.

Nézzük meg az egész folyamatot az Ubuntu és az Apache segítségével konfigurált PHP-interpreter példáján. Más konfigurációk esetén a fájl elérési útvonalak eltérőek lehetnek, de a lényeg ugyanaz. Az Xdebug hibakereső lehetővé teszi a kódfuttatás szüneteltetését, a híváshalmaz és a változók tartalmának megtekintését. Egyetlen hátránya, hogy nincs kényelmes vezérlőfelülete. A hibakeresés kezelésére általában IDE-ket használunk. Az IDE azonban nem tudja megmondani a hibakeresőnek, hogy indítsa el a hibakeresést, mert csak a kódért felelős. Ehhez szükség van a Debug Helper böngészőbővítményre, amelynek segítségével engedélyezheti a hibakeresési módot.

Először is telepítenie kell az Xdebug-ot. Ehhez hajtsa végre a következőt:

$ sudo apt install xdebug

Miután az Xdebug telepítése befejeződött, úgy kell beállítanunk a programot, hogy a hibakeresés indításakor megpróbáljon kapcsolódni az IDE-ünkhöz a hibakeresés vezérléséhez. Ehhez az Xdebug 2 verzióban az alábbi sorokat kell hozzáadni az /etc/php/7.4/apache2/conf.d/20-xdebug.ini fájlhoz:

$ sudo vi /etc/php/7.4/apache2/conf.d/20-xdebug.ini
zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_connect_back=1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=false

Újabb verzió esetén célszerű más formátumot használni:

xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.discover_client_host = false
xdebug.client_host = 127.0.0.1
xdebug.client_port = 9000

Nézzük meg közelebbről a beállításokat. Az első paraméter xdebug.mode - hibakeresési mód, a lehetséges beállítások a következők:

  • develop - további információk kimenetét engedélyezi, felülírja a var_dumpot;

  • debug - a kód soronkénti végrehajtásának módja, ez az a mód, amelyre ebben az esetben szükségünk van;

  • profile - profilozás;

  • trace - a program végrehajtásánaknyomon követése.

Több üzemmód egyidejűleg engedélyezhető, ha vesszőkkel van felsorolva. A második sor xdebug.start_with_request meghatározza, hogy a debugger hogyan induljon el debug, trace és hasonló módok esetén:

  • yes - mindig, php szkriptek futtatásakor;
  • no - csak speciális függvényeket használó kódból indul;
  • trigger - kérésre, a $_ENV, $_POST, $COOKIE vagy más tömbben lévő speciális változó segítségével. Ez az opció illik a legjobban, hogy a hibakereső ne fusson akkor, amikor nincs rá szükség.

A harmadik xdebug.discover_client_host értéke true, ebben az esetben az xdebug megpróbál a HTTP_X_FORWARDED_FOR fejlécben átadott hosthoz csatlakozni. Mivel a host a következő sorban van megadva, erre a funkcióra ebben az esetben nincs szükség. Ezután a hibakeresés vezérléséhez a 127.0.0.1 és a 9000-es port a kliens host, amelyhez csatlakozni kell. Ez a PhpStormban jelenleg használt alapértelmezett port. A beállítások mentése után újra kell indítani az Apache-ot egy speciális parancs segítségével:

$ sudo systemctl restart apache2

Ezután a PhpStormot kell konfigurálnia. Indítsa el a programot, majd nyissa meg a Futtatás -> Konfigurációk szerkesztése menüt. Megjelenik egy ablak, ahol a hibakereső konfigurálását kell elvégeznie.

Настраиваем XDEBUG в PHPSTORM

Kattintson a + gombra, és a megnyíló listából válassza ki a PHP Remote Debugger-t:

НАСТРОЙКА XDEBUG В PHPSTORM

Ne változtass semmit a beállításokban, csak add meg ennek a hibakeresési módszernek a nevét. Ha nem adja meg a szervert, ahonnan a kapcsolatokat várják, akkor minden kapcsolat elfogadott lesz.

Настраиваем XDEBUG в PHPSTORM

Ha meg akarja változtatni a portot, amelyre az Xdebug csatlakozni fog, nyissa meg a Fájl -> Beállítások -> PHP -> Debug -> DBGp Proxy. Itt megadhatja a kívánt portot.

Настраиваем XDEBUG в PHPSTORM

Mondhatjuk, hogy most már az IDE készen áll. Most kattintsunk a hibára a felső eszköztáron. A program elkezdi várni, hogy a debugger csatlakozzon, mi pedig a kódot tartalmazó sor elé kattintva a kódban néhány töréspontot fogunk elhelyezni:

Настраиваем XDEBUG в PHPSTORM

Most már csak a böngésző beállítása van hátra.A Chrome esetében letölthetünk egy speciális bővítményt. Telepítsük, és nyissuk meg a hibakeresésre szánt oldalt. Kattintson a bővítmény ikonjára, és válassza a Debug kiválasztását. A bővítmény ikonja zöldre változik:

Настраиваем XDEBUG в PHPSTORM

Frissítse az oldalt, és térjen vissza a PHPStormhoz. Ha mindent helyesen csináltál, akkor ott elindul a hibakeresés. Az első futtatáskor a program megkérheti, hogy a helyi fájl elérési útvonalakat úgy állítsa be, hogy azok megegyezzenek a távoli fájl elérési útvonalakkal. A helyi szerver esetében itt nem kell semmit konfigurálnia, csak kattintson az Elfogadás gombra:

Настраиваем XDEBUG в PHPSTORM

Ezt követően a hibakereső megállítja a végrehajtást a kiválasztott töréspontnál, és a programban megjelenik a hibakeresési felület:

Настраиваем XDEBUG в PHPSTORM

Most értsük meg, hogyan kell konfigurálni az Xdebug PhpStorm és Docker.

PHP hibakeresés a DOCKER-ben

A Docker egy kicsit trükkös lehet. Mivel a hibakeresőnek magához az IDE-hez kell csatlakoznia, továbbítania kell a hosztot a konténerhez. Windowson ezt a host.docker.internal cím használatával lehet megtenni. Linuxon azonban ez alapértelmezés szerint nem történik meg. Egy ilyen cím hozzáadásához a következő sorokat kell hozzáadni a docker-compose-hoz:

extra_hosts:

host.docker.internal: host-gateway

A következő könyvtárszerkezetet használjuk:

Настраиваем XDEBUG в PHPSTORM

A minimálisan szükséges docker-compose.yaml így fog kinézni:

version: '3.5'
networks:
  losst-network:
services:
  nginx:
    image: nginx
    ports:
        - '8094:80'
    volumes:
        - ./www/:/var/www/
        - ./conf/nginx:/etc/nginx/conf.d
    networks:
        - losst-network
  php-fpm:
    build: 
      context: ./conf/php-fpm
    extra_hosts:
      host.docker.internal: host-gateway
    volumes:
      - ./www:/var/www/
    networks:
      - losst-network

Egyszerűen két konténert, az nginxet és a php-fpm-et deklaráljuk. Az elsőn nem változtatunk semmit, így csak a hivatalos képet vesszük, csatlakoztatjuk a forrásmappát, a konfigurációs fájlt és a portot továbbítjuk. A második konténerbe az Xdebugot kell telepíteni és konfigurálni, így azt a hivatalos php konténer alapján kell majd megépíteni. Ugyanehhez a konténerhez meg kell adni az extra_hosts direktívát, enélkül semmi sem fog működni. Az Nginx konfigurációja is eléggé szabványos:

server {
  listen 80;
  server_name _ !default;
  root /var/www/;
  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-XSS-Protection "1; mode=block";
  add_header X-Content-Type-Options "nosniff";
  index index.html index.htm index.php;
  charset utf-8;
  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }
  error_page 404 /index.php;
  location ~ .php$ {
    fastcgi_pass php-fpm:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

Így konfiguráljuk a PHP szkriptek feldolgozását a php-fpm konténerben, és a nem létező URL-eket átirányítjuk az index.php-ra, ami eléggé szabványos sok keretrendszer és CMS esetében. A php-fpm konténer Dockerfile-jában ez így néz ki:

Telepítse az xdebug-ot a pecl segítségével, majd másolja be a konfigurációs fájlját a konténerbe. Fájl:

xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.discover_client_host = false
xdebug.client_host = host.docker.internal
xdebug.client_port = 9000

Xdebug 3 for PHP 8 települ a konténerbe, mert a régi verzió már nem működik a nyelv ezen verziójával, ezért az új konfigurációs szintaxist használjuk. Nos host, host.docker.internal, ami korábban a docker-compose.yaml-ben volt előírva. Az xdebug PHPStorm dokkoló konfigurációja most már teljes. Ezután futtathatja a projektet:

docker-compose up --build

Most az előző opcióhoz hasonlóan engedélyezheti a böngészőben a debug módot, frissítse az oldalt, és a debugger sikeresen csatlakozik az IDE-hez, annak ellenére, hogy a Dockerben fut.

Настраиваем XDEBUG в PHPSTORM