Felsökning är en av de viktigaste processerna inom programmering. Med hjälp av en debugger kan du se vad som händer i programmet, vilka funktioner som körs, vad som lagras i variabler, samt köra allt steg för steg och förstå exakt på vilken rad och vid vilka värden på variabler ett fel uppstår.
Till exempel används Xdebug debugger för PHP, PHPStorm är en av de mest populära utvecklingsmiljöerna. Låt oss nu se hur du konfigurerar Xdebug i PhpStorm för felsökning på lokal dator och i Docker.
Låt oss prata om hur felsökning görs på den lokala servern.
Låt oss titta på hela processen med Ubuntu och PHP-tolken konfigurerad med Apache som ett exempel. För andra konfigurationer kan filsökvägarna vara annorlunda, men poängen är densamma. Med Xdebug debugger kan du pausa kodkörningen, visa anropsstacken och innehållet i variabler. Dess enda nackdel är att det inte finns något bekvämt kontrollgränssnitt. IDE används vanligtvis för att hantera felsökning. Men IDE kan inte säga till debuggern att starta felsökningen eftersom den bara är ansvarig för koden. För detta ändamål behöver du webbläsartillägget Debug Helper, med hjälp av vilket du kan aktivera felsökningsläget.
Först måste du installera Xdebug. För att göra detta, kör:
$ sudo apt install xdebug
När installationen av Xdebug är klar bör du konfigurera programmet så att när du startar en felsökningssession försöker det ansluta till vår IDE för att kontrollera felsökningen. För att göra detta lägger du till dessa rader i 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
För en nyare version är det bäst att använda ett annat 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
Låt oss ta en närmare titt på inställningarna. Den första parametern xdebug.mode
- felsökningsläge, möjliga alternativ är:
develop
- aktiverar utmatning av ytterligare information, åsidosätter var_dump;
debug
- läge för kodkörning rad för rad, det är det läge vi behöver i det här fallet;
profile
- profilering;
trace
-spårning
av programkörning.
Flera lägen aktiveras samtidigt när de anges med kommatecken. Den andra raden xdebug.start_with_request definierar hur felsökaren ska startas för debug, trace och liknande lägen:
Den tredje xdebug.discover_client_host
är satt till true, i vilket fall xdebug försöker ansluta till den värd som skickas i HTTP_X_FORWARDED_FOR-huvudet
. Eftersom värden anges på nästa rad behövs inte den här funktionen i det här fallet. Nästa klientvärd att ansluta till för felsökningskontroll är 127.0.0.1 och port 9000. Detta är den standardport som används i PhpStorm för tillfället. När du har sparat inställningarna måste du starta om Apache med hjälp av ett speciellt kommando:
$ sudo systemctl restart apache2
Därefter ska du konfigurera PhpStorm. Kör programmet och öppna sedan menyn Run -> Edit Configurations. Du kommer att se ett fönster där du måste konfigurera felsökaren.
Klicka på +-knappen och välj PHP Remote Debugger i listan som öppnas:
Ändra ingenting i inställningarna, ange bara namnet på den här felsökningsmetoden. Om du inte anger den server från vilken anslutningar förväntas, kommer alla anslutningar att accepteras.
Om du vill ändra porten som Xdebug kommer att ansluta till, öppna File -> Settings -> PHP -> Debug -> DBGp Proxy. Här kan du ange önskad port.
Vi kan säga att nu är IDE:n klar. Klicka nu på buggen i det övre verktygsfältet. Programmet kommer att börja vänta på att debuggern ska ansluta och vi kommer att lägga några brytpunkter i koden genom att klicka framför raden med koden:
Nu återstår bara att konfigurera webbläsaren.För Chrome kan du ladda ner ett speciellt tillägg. Installera det och öppna sidan du vill debugga. Klicka på ikonen för tillägget och välj Debug. Ikonen för tillägget blir grön:
Uppdatera sidan och gå tillbaka till PHPStorm. Om allt har gått rätt till kommer en felsökningssession att starta där. Vid första körningen kan programmet be dig att konfigurera lokala filsökvägar så att de matchar fjärranslutna filsökvägar. För den lokala servern behöver du inte konfigurera något här, klicka bara på Accept:
Efter det kommer felsökaren att stoppa exekveringen vid den valda brytpunkten och felsökningsgränssnittet visas i programmet:
Låt oss nu förstå hur man konfigurerar Xdebug PhpStorm och Docker.
Docker kan vara lite knepigt. Eftersom felsökaren måste ansluta till själva IDE:n måste du vidarebefordra värden till containern. På Windows kan detta göras med hjälp av adressen host.docker.internal. Men i Linux sker detta inte som standard. För att lägga till en sådan adress måste du lägga till följande rader i docker-compose:
extra_hosts:
host.docker.internal: host-gateway
Vi använder följande katalogstruktur:
Den minimikrav docker-compose.yaml
kommer att se ut så här:
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 deklarerar helt enkelt två behållare, nginx och php-fpm
. Vi gör inga ändringar i den första, så vi kan bara ta den officiella bilden, montera källmappen, konfigurationsfilen och port forward. I den andra containern är det nödvändigt att installera och konfigurera Xdebug, så den måste byggas på grundval av den officiella php-containern. För samma behållare är det nödvändigt att ange direktivet extra_hosts
, utan det fungerar ingenting. Nginx-konfigurationen är också ganska 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;
}
}
Så här konfigurerar du bearbetning av PHP-skript i php-fpm-containern och omdirigerar icke-existerande webbadresser till index.php
, vilket är ganska standard för många ramverk och CMS. I Dockerfilen för php-fpm-behållaren ser det ut så här:
Installera xdebug med hjälp av pecl och kopiera sedan dess konfigurationsfil till behållaren. Filen:
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 för PHP 8 installeras i behållaren, eftersom den gamla versionen inte fungerar med den här versionen av språket längre, så den nya konfigurationssyntaxen används. Well host, host.docker.internal
, som tidigare föreskrevs i docker-compose.yaml. Konfigurationen av xdebug PHPStorm docker är nu klar. Därefter kan du köra projektet:
docker-compose up --build
Nu, som i föregående alternativ, kan du aktivera felsökningsläge i webbläsaren, uppdatera sidan och felsökaren kommer framgångsrikt att ansluta till IDE, trots att den körs i Docker