Feilsøking er en av de viktigste prosessene i programmering. Ved hjelp av en debugger kan du se hva som skjer i programmet, hvilke funksjoner som utføres, hva som er lagret i variabler, samt utføre alt trinn for trinn og forstå nøyaktig på hvilken linje og ved hvilke verdier av variabler det oppstår en feil.
For eksempel brukes Xdebug debugger for PHP, PHPStorm er et av de mest populære utviklingsmiljøene. La oss nå se hvordan du konfigurerer Xdebug i PhpStorm for feilsøking på lokal datamaskin og i Docker.
La oss snakke om hvordan feilsøking gjøres på den lokale serveren.
La oss se på hele prosessen ved hjelp av Ubuntu og PHP-tolken konfigurert med Apache som et eksempel. For andre konfigurasjoner kan filbanene være forskjellige, men poenget er det samme. Xdebug-feilsøkingsprogrammet lar deg sette kodeutførelsen på pause, se anropsstakken og innholdet i variabler. Den eneste ulempen er at det ikke finnes noe praktisk kontrollgrensesnitt. IDE-er brukes vanligvis til å administrere feilsøking. Men IDE kan ikke be feilsøkingsprogrammet om å starte feilsøking fordi det kun er ansvarlig for koden. For dette formålet trenger du nettleserutvidelsen Debug Helper, som du kan bruke til å aktivere feilsøkingsmodus.
Først må du installere Xdebug. For å gjøre dette, kjør:
$ sudo apt install xdebug
Når installasjonen av Xdebug er fullført, bør du konfigurere programmet slik at når du starter en feilsøkingsøkt, prøver det å koble seg til IDE-en vår for å kontrollere feilsøkingen. Dette gjør du ved å legge til disse linjene i filen /etc/php/7.4/apache2/conf.d/20-xdebug.ini i
Xdebug 2-versjonen:
$ 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 versjon er det best å bruke et annet 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
La oss se nærmere på innstillingene. Den første parameteren xdebug.mode
- feilsøkingsmodus, mulige alternativer er:
develop - aktiverer
utdata av tilleggsinformasjon, overstyrer var_dump;
debug
- modus for linje-for-linje kodeutførelse, det er modusen vi trenger i dette tilfellet;
profile
- profilering;
trace
-sporing
av programutførelse.
Flere moduser er aktivert samtidig når de er oppført i komma. Den andre linjen xdebug.start_with_request definerer hvordan feilsøkingsprogrammet skal startes for feilsøking, sporing og lignende moduser:
Den tredje xdebug.discover_client_host
er satt til true, og i så fall prøver xdebug å koble seg til verten som er oppgitt i HTTP_X_FORWARDED_FOR-overskriften
. Siden verten er spesifisert i neste linje, er denne funksjonen ikke nødvendig i dette tilfellet. Neste klientvert å koble seg til for feilsøkingskontroll er 127.0.0.1 og port 9000. Dette er standardporten som brukes i PhpStorm for øyeblikket. Etter at du har lagret innstillingene, må du starte Apache på nytt ved hjelp av en spesiell kommando:
$ sudo systemctl restart apache2
Deretter bør du konfigurere PhpStorm. Kjør programmet, og åpne deretter menyen Run -> Edit Configurations. Du vil se et vindu der du må konfigurere feilsøkingsprogrammet.
Klikk på +-knappen og velg PHP Remote Debugger fra listen som åpnes:
Ikke endre noe i innstillingene, bare spesifiser navnet på denne feilsøkingsmetoden. Hvis du ikke angir serveren som det forventes tilkoblinger fra, vil alle tilkoblinger bli akseptert.
Hvis du vil endre porten som Xdebug vil koble til, åpner du Fil -> Innstillinger -> PHP -> Debug -> DBGp Proxy. Her kan du spesifisere ønsket port.
Vi kan si at nå er IDE klar. Klikk nå på feilen på den øverste verktøylinjen. Programmet vil begynne å vente på at feilsøkingsprogrammet skal koble seg til, og vi legger inn noen bruddpunkter i koden ved å klikke foran linjen med koden:
Nå gjenstår det bare å konfigurere nettleseren. For Chrome kan du laste ned en spesiell utvidelse. Installer den og åpne siden du vil feilsøke. Klikk på utvidelsesikonet og velg Debug. Utvidelsesikonet blir grønt:
Oppdater siden og gå tilbake til PHPStorm. Hvis alt er gjort riktig, vil en feilsøkingsøkt starte der. Ved første kjøring kan programmet be deg om å konfigurere lokale filstier slik at de samsvarer med eksterne filstier. For den lokale serveren trenger du ikke å konfigurere noe her, bare klikk på Godta:
Deretter stopper feilsøkingsprogrammet kjøringen ved det valgte stoppunktet, og feilsøkingsgrensesnittet vises i programmet:
La oss nå se hvordan du konfigurerer Xdebug PhpStorm og Docker.
Docker kan være litt vanskelig. Siden feilsøkingsprogrammet må koble seg til selve IDE-en, må du videresende verten til containeren. På Windows kan dette gjøres ved hjelp av adressen host.docker.internal. Men i Linux skjer ikke dette som standard. For å legge til en slik adresse må du legge til følgende linjer i docker-compose:
extra_hosts:
host.docker.internal: host-gateway
Vi bruker følgende katalogstruktur:
Minimumskravet til docker-compose.yaml
vil se slik ut:
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 deklarerer ganske enkelt to containere, nginx og php-fpm
. Vi gjør ingen endringer i den første, så vi kan bare ta den offisielle avbildningen, montere kildemappen, konfigurasjonsfilen og videresende porten. I den andre containeren er det nødvendig å installere og konfigurere Xdebug, så den må bygges på grunnlag av den offisielle php-containeren. For den samme containeren er det nødvendig å spesifisere direktivet extra_hosts
, uten det vil ingenting fungere. Nginx-konfigurasjonen er også ganske 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;
}
}
Slik konfigurerer du PHP-skriptbehandling i php-fpm-containeren, og omdirigerer ikke-eksisterende nettadresser til index.php
, noe som er ganske standard for mange rammeverk og CMS. I Dockerfilen til php-fpm-containeren ser det slik ut:
Installer xdebug ved hjelp av pecl, og kopier deretter konfigurasjonsfilen inn i containeren. File:
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 installert i containeren, fordi den gamle versjonen ikke fungerer med denne versjonen av språket lenger, så den nye konfigurasjonssyntaksen brukes. Vel host, host.docker.internal
, som tidligere ble foreskrevet i docker-compose.yaml. Konfigurasjonen av xdebug PHPStorm docker er nå fullført. Deretter kan du kjøre prosjektet:
docker-compose up --build
Nå, som i det forrige alternativet kan du aktivere feilsøkingsmodus i nettleseren, oppdatere siden og feilsøkingsprogrammet vil lykkes koble til IDE, til tross for at det kjører i Docker