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.
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:
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.
Kattintson a + gombra, és a megnyíló listából válassza ki a PHP Remote Debugger-t:
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.
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.
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:
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:
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:
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:
Most értsük meg, hogyan kell konfigurálni az Xdebug PhpStorm és Docker.
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:
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.