Vigade kõrvaldamine on üks tähtsamaid protsesse programmeerimisel. Debuggeri abil saab näha, mis programmis toimub, milliseid funktsioone täidetakse, mis on salvestatud muutujatesse, samuti saab kõike samm-sammult läbi viia ja täpselt aru saada, millisel real ja milliste muutujate väärtuste juures viga esineb.
Näiteks PHP puhul kasutatakse Xdebug deebuggerit, PHPStorm on üks populaarsemaid arenduskeskkondi. Järgnevalt vaatame, kuidas konfigureerida Xdebug PhpStormis silumiseks kohalikus arvutis ja Dockeris.
Räägime sellest, kuidas toimub silumine lokaalses serveris.
Vaatame kogu protsessi Ubuntu ja Apache'iga konfigureeritud PHP interpretaatori näitel. Teiste konfiguratsioonide puhul võivad failiteed olla erinevad, kuid mõte on sama. Xdebug'i silur võimaldab peatada koodi täitmist, vaadata kutsete virna ja muutujate sisu. Selle ainus puudus on see, et puudub mugav kontroll-liides. Debugimise haldamiseks kasutatakse tavaliselt IDE-d. Kuid IDE ei saa öelda silurile, et ta alustaks silumist, sest ta vastutab ainult koodi eest. Selleks on vaja Debug Helper brauseripikendust, mille abil saab lubada silumisrežiimi.
Kõigepealt tuleb paigaldada Xdebug. Selleks käivitage:
$ sudo apt install xdebug
Kui Xdebug'i paigaldamine on lõpetatud, tuleb programm konfigureerida nii, et see üritab silumise seansi käivitamisel meie IDE-ga ühendust võtta, et kontrollida silumist. Selleks lisage need read faili /etc/php/7.4/apache2/conf.d/20-xdebug.ini
Xdebug 2 versioonis:
$ 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
Uuema versiooni puhul on parem kasutada teistsugust formaati:
xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.discover_client_host = false
xdebug.client_host = 127.0.0.1
xdebug.client_port = 9000
Vaatame seadistusi lähemalt. Esimene parameeter xdebug.mode
- silumisrežiim, võimalikud valikud on:
develop
- võimaldab lisainfo väljastamise, tühistab var_dump;
debug
- rea kaupa koodi täitmise režiim, seda režiimi vajame antud juhul;
profile
- profileerimine;
trace
- programmi täitmisejälgimine
.
Mitu režiimi on samaaegselt lubatud, kui need on loetletud komadega. Teine rida xdebug.start_with_request määrab, kuidas debugger käivitatakse debug, trace ja sarnaste režiimide puhul:
Kolmas xdebug.discover_client_host
on seatud väärtuseks true, mille puhul xdebug üritab ühendust võtta HTTP_X_FORWARDED_FOR
päises edastatud hostiga. Kuna host on määratud järgmises reas, ei ole see funktsioon antud juhul vajalik. Järgmisena on kliendihost, millega debugimise kontrollimiseks ühenduda, 127.0.0.1 ja port 9000. See on hetkel PhpStormis kasutatav vaikimisi port. Pärast seadete salvestamist tuleb Apache taaskäivitada, kasutades selleks spetsiaalset käsku:
$ sudo systemctl restart apache2
Järgmisena tuleb konfigureerida PhpStorm. Käivitage programm, seejärel avage menüü Run -> Edit Configurations. Teile avaneb aken, kus tuleb konfigureerida silur.
Klõpsake nupule + ja valige avanevast nimekirjast PHP Remote Debugger:
Ärge muutke seadetes midagi, määrake lihtsalt selle silumismeetodi nimi. Kui te ei määra serverit, kust ühendusi oodatakse, võetakse vastu kõik ühendused.
Kui soovite muuta porti, millega Xdebug ühendub, avage File -> Settings -> PHP -> Debug -> DBGp Proxy. Siin saate määrata soovitud pordi.
Võime öelda, et nüüd on IDE valmis. Nüüd klõpsake ülemisel tööriistaribal veale. Programm hakkab ootama, et debugger ühenduks ja me paneme koodile mõned breakpoints, klõpsates lihtsalt koodiga rea ees:
Nüüd on jäänud vaid brauseri konfigureerimine.Chrome'i jaoks saab alla laadida spetsiaalse laienduse. Installige see ja avage lehekülg, mida soovite siluda. Klõpsake laienduse ikoonil ja valige Debug. Laienduse ikoon muutub roheliseks:
Värskendage lehte ja minge tagasi PHPStormi. Kui kõik oli õigesti tehtud, algab seal silumisseanss. Esimesel käivitamisel võib programm paluda teil konfigureerida kohalikud failiteed, et need vastaksid kaugfailide teedele. Kohaliku serveri puhul ei pea siin midagi konfigureerima, vajutage lihtsalt nuppu Accept:
Pärast seda peatab silumisprogramm täitmise valitud katkestuspunktis ja programmis ilmub silumisliides:
Nüüd mõistame, kuidas konfigureerida Xdebug PhpStormi ja Dockeri.
Docker võib olla natuke keeruline. Kuna silur peab ühenduma IDE-ga ise, tuleb konteinerile edastada vastuvõtja. Windowsis saab seda teha, kasutades aadressi host.docker.internal. Kuid Linuxis ei toimu seda vaikimisi. Sellise aadressi lisamiseks tuleb docker-compose'ile lisada järgmised read:
extra_hosts:
host.docker.internal: host-gateway
Kasutame järgmist kataloogistruktuuri:
Minimaalselt vajalik docker-compose.yaml
näeb välja selline:
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
Me lihtsalt deklareerime kaks konteinerit, nginx ja php-fpm
. Esimeses me ei tee mingeid muudatusi, seega võime lihtsalt võtta ametliku image'i, monteerida lähtekausta, konfiguratsioonifaili ja portide edastamise. Teises konteineris on vaja installeerida ja konfigureerida Xdebug, seega tuleb see ehitada ametliku php konteineri põhjal. Sama konteineri jaoks on vaja määrata extra_hosts
direktiiv, ilma selleta ei tööta midagi. Nginxi konfiguratsioon on samuti üsna standardne:
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;
}
}
Nii konfigureeritakse PHP-skriptide töötlemine php-fpm konteineris ja suunatakse mitteolemasolevad URL-id ümber index.php-le
, mis on üsna standardne paljude raamistike ja CMS-i puhul. Dockerfile'is näeb php-fpm konteiner välja nii:
Paigaldage xdebug kasutades pecl ja seejärel kopeerige selle konfiguratsioonifail konteinerisse. Faili:
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 paigaldatakse konteinerisse, sest vana versioon ei tööta enam selle keeleversiooniga, seega kasutatakse uut konfiguratsiooni süntaksit. Noh host, host.docker.internal
, mis varem oli ette nähtud docker-compose.yamlis. xdebug PHPStormi dokkeri konfigureerimine on nüüd valmis. Järgmisena saate projekti käivitada:
docker-compose up --build
Nüüd, nagu eelmises variandis, saate lubada brauseris debugirežiimi, värskendada lehte ja debugger ühendub edukalt IDE-ga, hoolimata sellest, et see töötab Dockeris