Fejlfinding er en af de vigtigste processer i programmering. Ved hjælp af en debugger kan du se, hvad der sker i programmet, hvilke funktioner der udføres, hvad der gemmes i variabler, samt udføre alt trin for trin og forstå præcis på hvilken linje og ved hvilke værdier af variabler, der opstår en fejl.
Xdebug debugger bruges f.eks. til PHP, og PHPStorm er et af de mest populære udviklingsmiljøer. Lad os nu se, hvordan man konfigurerer Xdebug i PhpStorm til fejlfinding på den lokale computer og i Docker.
Lad os tale om, hvordan fejlsøgning udføres på den lokale server.
Lad os se på hele processen ved hjælp af Ubuntu og PHP-fortolkeren konfigureret med Apache som et eksempel. For andre konfigurationer kan filstierne være anderledes, men pointen er den samme. Xdebug-debuggeren giver dig mulighed for at sætte udførelsen af koden på pause, se opkaldsstakken og indholdet af variabler. Den eneste ulempe er, at der ikke er nogen praktisk kontrolgrænseflade. IDE'er bruges normalt til at styre debugging. Men IDE kan ikke bede debuggeren om at starte debugging, fordi den kun er ansvarlig for koden. Til dette formål skal du bruge browserudvidelsen Debug Helper, ved hjælp af hvilken du kan aktivere fejlsøgningstilstand.
Først skal du installere Xdebug. For at gøre dette skal du udføre:
$ sudo apt install xdebug
Når installationen af Xdebug er færdig, skal du konfigurere programmet, så det, når du starter en debugging-session, forsøger at oprette forbindelse til vores IDE for at kontrollere debugging. Det gør du ved at tilføje disse linjer til filen /etc/php/7.4/apache2/conf.d/20-xdebug.ini i
Xdebug 2-versionen:
$ 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
For en nyere version er det bedst at bruge et andet 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
Lad os se nærmere på indstillingerne. Den første parameter xdebug.mode
- debugging mode, mulige indstillinger er:
develop
-aktiverer
output af yderligere information, tilsidesætter var_dump;
debug
- tilstand for linje-for-linje-kodeudførelse, det er den tilstand, vi har brug for i dette tilfælde;
profile
- profilering;
trace
-sporing
af programudførelse.
Flere tilstande aktiveres samtidigt, når de er angivet med kommaer. Den anden linje xdebug.start_with_request definerer, hvordan debuggeren skal startes i debug-, trace- og lignende tilstande:
Den tredje xdebug.discover_client_host
er sat til true, og i så fald forsøger xdebug at oprette forbindelse til den host, der er angivet i HTTP_X_FORWARDED_FOR-headeren
. Da værten er specificeret i næste linje, er denne funktion ikke nødvendig i dette tilfælde. Dernæst er den klientvært, der skal oprettes forbindelse til for debugging-kontrol, 127.0.0.1 og port 9000. Det er den standardport, der bruges i PhpStorm i øjeblikket. Når du har gemt indstillingerne, skal du genstarte Apache ved hjælp af en særlig kommando:
$ sudo systemctl restart apache2
Dernæst skal du konfigurere PhpStorm. Kør programmet, og åbn derefter menuen Kør -> Rediger konfigurationer. Du vil se et vindue, hvor du skal konfigurere debuggeren.
Klik på +-knappen, og vælg PHP Remote Debugger på den liste, der åbnes:
Du skal ikke ændre noget i indstillingerne, men blot angive navnet på denne fejlfindingsmetode. Hvis du ikke angiver den server, der forventes forbindelser fra, vil alle forbindelser blive accepteret.
Hvis du vil ændre den port, som Xdebug vil oprette forbindelse til, skal du åbne File -> Settings -> PHP -> Debug -> DBGp Proxy. Her kan du angive den ønskede port.
Vi kan sige, at nu er IDE'en klar. Klik nu på fejlen på den øverste værktøjslinje. Programmet vil begynde at vente på, at debuggeren opretter forbindelse, og vi sætter nogle breakpoints i koden ved at klikke foran linjen med koden:
Nu er der kun tilbage at konfigurere browseren.Til Chrome kan du downloade en særlig udvidelse. Installer den, og åbn den side, du vil debugge. Klik på udvidelsesikonet, og vælg Debug. Udvidelsesikonet bliver grønt:
Opdater siden, og gå tilbage til PHPStorm. Hvis alt er gjort korrekt, vil en fejlsøgningssession starte der. Ved første kørsel kan programmet bede dig om at konfigurere de lokale filstier, så de matcher de eksterne filstier. For den lokale server behøver du ikke at konfigurere noget her, bare klik på Accept:
Derefter stopper debuggeren udførelsen ved det valgte breakpoint, og debugging-grænsefladen vises i programmet:
Lad os nu se, hvordan man konfigurerer Xdebug PhpStorm og Docker.
Docker kan være lidt vanskelig. Da debuggeren skal oprette forbindelse til selve IDE'en, skal du videresende værten til containeren. På Windows kan dette gøres ved hjælp af adressen host.docker.internal. Men i Linux sker det ikke som standard. For at tilføje en sådan adresse skal du tilføje følgende linjer til docker-compose:
extra_hosts:
host.docker.internal: host-gateway
Vi bruger følgende mappestruktur:
Den mindst nødvendige docker-compose.yaml
vil se sådan ud:
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
Vi erklærer blot to containere, nginx og php-fpm
. Vi foretager ingen ændringer i den første, så vi kan bare tage det officielle image, montere kildemappen, konfigurationsfilen og port forward. I den anden container er det nødvendigt at installere og konfigurere Xdebug, så den skal bygges på basis af den officielle php-container. For den samme container er det nødvendigt at angive direktivet extra_hosts
, uden det vil intet fungere. Nginx-konfigurationen er også ret standard:
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;
}
}
Det er sådan, man konfigurerer PHP-scripts, der behandles i php-fpm-containeren, og omdirigerer ikke-eksisterende URL'er til index.php
, hvilket er standard for mange frameworks og CMS. I Dockerfilen til php-fpm-containeren ser det sådan ud:
Installer xdebug ved hjælp af pecl, og kopier derefter dens konfigurationsfil ind i containeren. Fil:
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 er installeret i containeren, fordi den gamle version ikke længere fungerer med denne version af sproget, så den nye konfigurationssyntaks bruges. Well host, host.docker.internal
, som plejede at være foreskrevet i docker-compose.yaml. Konfigurationen af xdebug PHPStorm docker er nu færdig. Dernæst kan du køre projektet:
docker-compose up --build
Nu kan du, som i den forrige mulighed, aktivere debug-tilstand i browseren, opdatere siden, og debuggeren vil oprette forbindelse til IDE'en, på trods af at den kører i Docker.