Derinimas yra vienas svarbiausių programavimo procesų. Naudodami derinimo programą galite matyti, kas vyksta programoje, kokios funkcijos vykdomos, kas saugoma kintamuosiuose, taip pat viską atlikti žingsnis po žingsnio ir tiksliai suprasti, kurioje eilutėje ir prie kokių kintamųjų reikšmių įvyksta klaida.
Pavyzdžiui, Xdebug derintuvas naudojamas PHP, PHPStorm yra viena populiariausių kūrimo aplinkų. Toliau pažiūrėkime, kaip sukonfigūruoti "Xdebug" "PhpStorm", kad būtų galima derinti vietiniame kompiuteryje ir "Docker" programoje.
Pakalbėkime apie tai, kaip atliekamas derinimas vietiniame serveryje.
Apžvelkime visą procesą, kaip pavyzdį naudodami "Ubuntu" ir PHP interpretatorių, sukonfigūruotą su "Apache". Kitų konfigūracijų atveju failų keliai gali būti kitokie, tačiau esmė ta pati. Xdebug derintuvas leidžia sustabdyti kodo vykdymą, peržiūrėti skambučių steką ir kintamųjų turinį. Vienintelis jo trūkumas - nėra patogios valdymo sąsajos. Derinimui valdyti paprastai naudojamos IDE. Tačiau IDE negali nurodyti derintuvui pradėti derinimą, nes ji atsakinga tik už kodą. Šiam tikslui reikia Debug Helper naršyklės plėtinio, kurio pagalba galima įjungti derinimo režimą.
Pirmiausia reikia įdiegti "Xdebug". Norėdami tai padaryti, atlikite:
$ sudo apt install xdebug
Baigę "Xdebug" diegimo procesą, turėtumėte sukonfigūruoti programą taip, kad pradėjus derinimo seansą ji bandytų prisijungti prie mūsų IDE ir valdyti derinimą. Norėdami tai padaryti, į /etc/php/7.4/apache2/conf.d/20-xdebug.ini
failą "Xdebug 2" versijoje pridėkite šias eilutes:
$ 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
Naujesnės versijos atveju geriausia naudoti kitą formatą:
xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.discover_client_host = false
xdebug.client_host = 127.0.0.1
xdebug.client_port = 9000
Atidžiau pažvelkime į nustatymus. Pirmasis parametras xdebug.mode
- derinimo režimas, galimos šios parinktys:
Įjungiamaspapildomos
informacijos išvedimas, pakeičia var_dump;
debug
- eilutė po eilutės kodo vykdymo režimas, šiuo atveju mums reikalingas būtent šis režimas;
profile
- profiliavimas;
trace
- programos vykdymosekimas
.
Keli režimai įjungiami vienu metu, kai jie išvardyti kableliais. Antroji eilutė xdebug.start_with_request apibrėžia, kaip bus paleidžiamas derintuvas derinimo, sekimo ir panašiais režimais:
Trečiasis xdebug.discover_client_host
nustatomas į true, tokiu atveju xdebug bando prisijungti prie HTTP_X_FORWARDED_FOR
antraštėje perduoto kompiuterio. Kadangi prieglobstis nurodytas kitoje eilutėje, šiuo atveju ši funkcija nereikalinga. Toliau nurodomas kliento prieglobstis, prie kurio jungiamasi derinimo kontrolei, yra 127.0.0.0.1 ir 9000 prievadas. Tai šiuo metu PhpStorm naudojamas numatytasis prievadas. Išsaugojus nustatymus, reikia perkrauti "Apache" naudojant specialią komandą:
$ sudo systemctl restart apache2
Toliau reikia sukonfigūruoti "PhpStorm". Paleiskite programą, tada atidarykite meniu Vykdyti -> Redaguoti konfigūracijas. Pamatysite langą, kuriame reikia sukonfigūruoti derintuvą.
Spustelėkite mygtuką + ir atsidariusiame sąraše pasirinkite PHP Remote Debugger (nuotolinis PHP derintuvas):
Nustatymuose nieko nekeiskite, tik nurodykite šio derinimo metodo pavadinimą. Jei nenurodysite serverio, iš kurio bus laukiama prisijungimų, bus priimami visi prisijungimai.
Jei norite pakeisti prievadą, prie kurio jungsis "Xdebug", atidarykite File -> Settings -> PHP -> Debug -> DBGp Proxy. Čia galite nurodyti norimą prievadą.
Galima sakyti, kad dabar IDE yra paruošta. Dabar viršutinėje įrankių juostoje spustelėkite klaidą. Programa pradės laukti, kol derintuvas prisijungs, o mes uždėsime keletą pertraukos taškų kode tiesiog spustelėdami prieš eilutę su kodu:
Dabar belieka tik sukonfigūruoti naršyklę.Chrome naršyklei galite atsisiųsti specialų plėtinį. Įdiekite jį ir atidarykite puslapį, kurį norite derinti. Spustelėkite plėtinio piktogramą ir pasirinkite Debug. Plėtinio piktograma taps žalia:
Atnaujinkite puslapį ir grįžkite į PHPStorm. Jei viskas buvo atlikta teisingai, ten prasidės derinimo seansas. Pirmo paleidimo metu programa gali paprašyti sukonfigūruoti vietinių failų kelius taip, kad jie sutaptų su nutolusių failų keliais. Vietiniam serveriui čia nieko konfigūruoti nereikia, tiesiog spustelėkite Priimti:
Po to derintuvas sustabdys vykdymą pasirinktame pertraukos taške ir programoje atsiras derinimo sąsaja:
Dabar suprasime, kaip sukonfigūruoti "Xdebug PhpStorm" ir "Docker".
Su "Docker" gali būti šiek tiek sudėtinga. Kadangi derintuvas turi jungtis prie pačios IDE, reikia persiųsti kompiuterio prieglobstį į konteinerį. Windows sistemoje tai galima padaryti naudojant adresą host.docker.internal. Tačiau "Linux" sistemoje pagal numatytuosius nustatymus tai nevyksta. Norėdami pridėti tokį adresą, turite į "docker-compose" įrašyti šias eilutes:
extra_hosts:
host.docker.internal: host-gateway
Naudojame tokią katalogų struktūrą:
Minimalus reikalaujamas docker-compose.yaml
atrodys taip:
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
Paprasčiausiai deklaruojame du konteinerius: nginx ir php-fpm
. Pirmajame nedarome jokių pakeitimų, todėl galime tiesiog paimti oficialų atvaizdą, prijungti šaltinio aplanką, konfigūracijos failą ir persiųsti prievadą. Antrajame konteineryje reikia įdiegti ir sukonfigūruoti Xdebug, todėl jį teks sukurti remiantis oficialiu php konteineriu. Tame pačiame konteineryje būtina nurodyti extra_hosts
direktyvą, be jos niekas neveiks. Nginx konfigūracija taip pat gana standartinė:
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;
}
}
Taip konfigūruojamas PHP scenarijų apdorojimas php-fpm konteineryje ir neegzistuojančių URL nukreipimas į index.php
, kuris yra gana standartinis daugeliui karkasų ir TVS. php-fpm konteinerio "Docker" faile jis atrodo taip:
Įdiekite xdebug naudodami pecl, tada nukopijuokite jo konfigūracijos failą į konteinerį. Failą:
xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.discover_client_host = false
xdebug.client_host = host.docker.internal
xdebug.client_port = 9000
Konteineryje įdiegiamas PHP 8 skirtas Xdebug 3, nes senoji versija su šia kalbos versija nebeveikia, todėl naudojama nauja konfigūracijos sintaksė. Na, o host, host.docker.internal
, kuris anksčiau buvo nurodytas docker-compose.yaml. Dabar xdebug PHPStorm docker konfigūracija baigta. Toliau galite paleisti projektą:
docker-compose up --build
Dabar, kaip ir ankstesniame variante, naršyklėje galite įjungti derinimo režimą, atnaujinti puslapį ir derintuvas sėkmingai prisijungs prie IDE, nepaisant to, kad jis veikia "Docker" aplinkoje