Programmēšanā atkļūdošana ir viens no svarīgākajiem procesiem. Ar atkļūdošanas programmas palīdzību var redzēt, kas notiek programmā, kādas funkcijas tiek izpildītas, kas tiek saglabāts mainīgajos, kā arī izpildīt visu soli pa solim un saprast, kurā rindā un pie kādām mainīgo vērtībām rodas kļūda.
Piemēram, Xdebug atkļūdošanas programma tiek izmantota PHP, PHPStorm ir viena no populārākajām izstrādes vidēm. Tālāk apskatīsim, kā konfigurēt Xdebug programmā PhpStorm atkļūdošanai lokālajā datorā un Docker.
Apskatīsim, kā tiek veikta atkļūdošana lokālajā serverī.
Apskatīsim visu procesu, kā piemēru izmantojot Ubuntu un PHP interpretatoru, kas konfigurēts ar Apache. Citās konfigurācijās failu ceļi var atšķirties, bet būtība ir tāda pati. Xdebug atkļūdošanas programma ļauj apturēt koda izpildi, apskatīt izsaukumu kaudzi un mainīgo saturu. Tā vienīgais trūkums ir tas, ka nav ērtas vadības saskarnes. Parasti atkļūdošanas pārvaldībai izmanto IDE. Taču IDE nevar norādīt atkļūdošanas programmai sākt atkļūdošanu, jo tā ir atbildīga tikai par kodu. Šim nolūkam ir nepieciešams Debug Helper pārlūkprogrammas paplašinājums, ar kura palīdzību var ieslēgt atkļūdošanas režīmu.
Vispirms ir jāinstalē Xdebug. Lai to izdarītu, izpildiet:
$ sudo apt install xdebug
Kad Xdebug instalēšanas process ir pabeigts, jums jākonfigurē programma tā, lai, uzsākot atkļūdošanas sesiju, tā mēģinātu izveidot savienojumu ar mūsu IDE atkļūdošanas kontrolei. Lai to izdarītu, Xdebug 2 versijas failā /etc/php/7.4/apache2/conf.d/20-xdebug.ini
pievienojiet šīs rindiņas:
$ 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
Jaunākai versijai vislabāk ir izmantot citu formātu:
xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.discover_client_host = false
xdebug.client_host = 127.0.0.1
xdebug.client_port = 9000
Aplūkosim sīkāk iestatījumus. Pirmais parametrs xdebug.mode
- atkļūdošanas režīms, iespējamās opcijas ir:
var_dump
- ļauj izvadīt papildu informāciju, aizstāj var_dump;
atkļūdošana (debug)
- rindas pa rindiņai koda izpildes režīms, tas ir režīms, kas mums šajā gadījumā ir nepieciešams;
profile
- profilēšana;
trace
- programmas izpildesizsekošana
.
Vairāki režīmi ir iespējoti vienlaicīgi, ja tie ir uzskaitīti ar komatiem. Otrajā rindā xdebug.start_with_request ir noteikts, kā tiks palaists atkļūdošanas programma atkļūdošanas, izsekošanas un līdzīgos režīmos:
Trešais xdebug.discover_client_host
ir iestatīts uz true, un šajā gadījumā xdebug mēģina izveidot savienojumu ar HTTP_X_FORWARDED_FOR
galvenē norādīto hostu. Tā kā resursdators ir norādīts nākamajā rindā, šī funkcija šajā gadījumā nav nepieciešama. Tālāk klienta resursdators, ar kuru izveidots savienojums atkļūdošanas kontrolei, ir 127.0.0.0.1 un ports 9000. Tas ir noklusējuma ports, kas pašlaik tiek izmantots PhpStorm. Pēc iestatījumu saglabāšanas ir jāpārstartē Apache, izmantojot īpašu komandu:
$ sudo systemctl restart apache2
Tālāk jākonfigurē PhpStorm. Palaidiet programmu un atveriet izvēlni Run -> Edit Configurations (Palaist -> Rediģēt konfigurācijas). Parādīsies logs, kurā jākonfigurē atkļūdošanas programma.
Nospiediet pogu + un atveramajā sarakstā izvēlieties PHP Remote Debugger:
Iestatījumos neko nemainiet, tikai norādiet šīs atkļūdošanas metodes nosaukumu. Ja nenorādīsiet serveri, no kura tiks gaidīti savienojumi, tiks pieņemti visi savienojumi.
Ja vēlaties mainīt portu, ar kuru Xdebug veidos savienojumu, atveriet File -> Settings -> PHP -> Debug -> DBGp Proxy. Šeit varat norādīt vēlamo portu.
Var teikt, ka tagad IDE ir gatava. Tagad noklikšķiniet uz kļūdas augšējā rīkjoslā. Programma sāks gaidīt, kad atkļūdošanas programma izveidos savienojumu, un mēs ievietosim dažus pārtraukuma punktus kodā, vienkārši noklikšķinot uz rindas ar kodu priekšā:
Tagad atliek tikai konfigurēt pārlūkprogrammu.Pārlūkprogrammai Chrome varat lejupielādēt īpašu paplašinājumu. Instalējiet to un atveriet lapu, kuru vēlaties atkļūdošanas nolūkā. Noklikšķiniet uz paplašinājuma ikonas un atlasiet Debug. Paplašinājuma ikona kļūs zaļa:
Atjauniniet lapu un atgriezieties PHPStorm. Ja viss ir izdarīts pareizi, tur sāksies atkļūdošanas sesija. Pirmajā palaišanas reizē programma var lūgt konfigurēt vietējo failu ceļus, lai tie atbilstu attālināto failu ceļiem. Vietējam serverim šeit nekas nav jākonfigurē, vienkārši noklikšķiniet uz Accept (Pieņemt):
Pēc tam atkļūdošanas programma apturēs izpildi izvēlētajā pārtraukuma punktā un programmā parādīsies atkļūdošanas saskarne:
Tagad sapratīsim, kā konfigurēt Xdebug PhpStorm un Docker.
Docker var būt nedaudz sarežģīts. Tā kā atkļūdošanas programmai ir jāsavienojas ar pašu IDE, jums ir jāpārsūta resursdators uz konteineru. Operētājsistēmā Windows to var izdarīt, izmantojot adresi host.docker.internal. Bet Linux sistēmā tas nenotiek pēc noklusējuma. Lai pievienotu šādu adresi, docker-compose ir jāpievieno šādas rindas:
extra_hosts:
host.docker.internal: host-gateway
Mēs izmantojam šādu direktoriju struktūru:
Minimālais nepieciešamais docker-compose.yaml
izskatās šādi:
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
Mēs vienkārši deklarējam divus konteinerus - nginx un php-fpm
. Pirmajā neveicam nekādas izmaiņas, tāpēc varam vienkārši paņemt oficiālo attēlu, pievienot avota mapi, konfigurācijas failu un pārsūtīt portu. Otrajā konteinerā ir nepieciešams instalēt un konfigurēt Xdebug, tāpēc tas būs jābūvē, pamatojoties uz oficiālo php konteineru. Tam pašam konteineram ir jānorāda extra_hosts
direktīva, bez tās nekas nedarbosies. Nginx konfigurācija arī ir diezgan standarta:
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;
}
}
Šādā veidā konfigurē PHP skriptu apstrādi php-fpm konteinerā un neeksistējošu URL pāradresē uz index.php
, kas ir diezgan standarta risinājums daudzos karkasos un CMS. php-fpm konteinera Docker failā tas izskatās šādi:
Instalējiet xdebug, izmantojot pecl, un pēc tam nokopējiet tā konfigurācijas failu konteinerā. Failu:
xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.discover_client_host = false
xdebug.client_host = host.docker.internal
xdebug.client_port = 9000
Konteinerī ir instalēts Xdebug 3 priekš PHP 8, jo vecā versija vairs nedarbojas ar šo valodas versiju, tāpēc tiek izmantota jaunā konfigurācijas sintakse. Labi host, host.docker.internal
, kas iepriekš bija noteikts docker-compose.yaml. Tagad xdebug PHPStorm docker konfigurācija ir pabeigta. Tālāk varat palaist projektu:
docker-compose up --build
Tagad, tāpat kā iepriekšējā variantā, jūs varat ieslēgt atkļūdošanas režīmu pārlūkprogrammā, atsvaidzināt lapu, un atkļūdošanas programma veiksmīgi izveidos savienojumu ar IDE, neskatoties uz to, ka tā darbojas Docker vidē.