Metode de plată Abuse

Configurarea Xdebug în PHPStorm

07.05.2021, 22:28

Depanarea este unul dintre cele mai importante procese în programare. Cu ajutorul unui debugger puteți vedea ce se întâmplă în program, ce funcții sunt executate, ce este stocat în variabile, precum și să executați totul pas cu pas și să înțelegeți exact pe ce linie și la ce valori ale variabilelor apare o eroare.

De exemplu, Xdebug debugger este utilizat pentru PHP, PHPStorm este unul dintre cele mai populare medii de dezvoltare. În continuare, să vedem cum să configurăm Xdebug în PhpStorm pentru depanare pe computerul local și în Docker.

Configurarea XDEBUG în PHPSTORM

Să vorbim despre cum se face depanarea pe serverul local.

Să ne uităm la întregul proces folosind Ubuntu și interpretorul PHP configurat cu Apache ca exemplu. Pentru alte configurații, căile fișierelor pot fi diferite, dar ideea este aceeași. Depanatorul Xdebug vă permite să întrerupeți execuția codului, să vizualizați stiva de apeluri și conținutul variabilelor. Singurul său dezavantaj este că nu există o interfață de control convenabilă. IDE-urile sunt utilizate de obicei pentru a gestiona depanarea. Dar IDE nu poate spune depanatorului să înceapă depanarea, deoarece este responsabil doar pentru cod. În acest scop, veți avea nevoie de extensia de browser Debug Helper, cu ajutorul căreia puteți activa modul de depanare.

Mai întâi trebuie să instalați Xdebug. Pentru a face acest lucru, executați:

$ sudo apt install xdebug

După ce procesul de instalare a Xdebug este finalizat, trebuie să configurați programul astfel încât atunci când începeți o sesiune de depanare să încerce să se conecteze la IDE-ul nostru pentru a controla depanarea. Pentru a face acest lucru, adăugați aceste linii la fișierul /etc/php/7.4/apache2/conf.d/20-xdebug.ini în versiunea Xdebug 2:

$ 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

Pentru o versiune mai nouă, este mai bine să utilizați un format diferit:

xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.discover_client_host = false
xdebug.client_host = 127.0.0.1
xdebug.client_port = 9000

Să aruncăm o privire mai atentă la setări. Primul parametru xdebug.mode - modul de depanare, opțiunile posibile sunt:

  • develop - permite ieșirea de informații suplimentare, prevalează asupra var_dump;

  • debug - modul de execuție a codului linie cu linie, este modul de care avem nevoie în acest caz;

  • profile - crearea de profiluri;

  • trace -urmărirea execuției programului.

Mai multe moduri sunt activate simultan atunci când sunt listate în virgulă. A doua linie xdebug.start_with_request definește modul în care debuggerul va fi pornit pentru modurile debug, trace și altele similare:

  • yes - întotdeauna, la rularea scripturilor php;
  • no - pornește numai din cod, utilizând funcții speciale;
  • trigger - la cerere, folosind o variabilă specială în $_ENV, $_POST, $COOKIE sau alt array. Această opțiune se potrivește cel mai bine în acest caz, astfel încât debuggerul să nu ruleze atunci când nu este necesar.

A treia opțiune xdebug.discover_client_host este setată la true, caz în care xdebug încearcă să se conecteze la gazda trecută în antetul HTTP_X_FORWARDED_FOR. Deoarece gazda este specificată în linia următoare, această caracteristică nu este necesară în acest caz. În continuare, gazda client la care să ne conectăm pentru controlul depanării este 127.0.0.1 și portul 9000. Acesta este portul implicit utilizat în PhpStorm în acest moment. După salvarea setărilor, trebuie să reporniți Apache folosind o comandă specială:

$ sudo systemctl restart apache2

În continuare, trebuie să configurați PhpStorm. Lansați programul, apoi deschideți meniul Run -> Edit Configurations. Veți vedea o fereastră în care trebuie să configurați depanatorul.

Настраиваем XDEBUG в PHPSTORM

Faceți clic pe butonul + și selectați PHP Remote Debugger din lista care se deschide:

НАСТРОЙКА XDEBUG В PHPSTORM

Nu modificați nimic în setări, specificați doar numele acestei metode de depanare. Dacă nu specificați serverul de la care se așteaptă conexiunile, toate conexiunile vor fi acceptate.

Настраиваем XDEBUG в PHPSTORM

Dacă doriți să modificați portul la care se va conecta Xdebug, deschideți File -> Settings -> PHP -> Debug -> DBGp Proxy. Aici puteți specifica portul dorit.

Настраиваем XDEBUG в PHPSTORM

Putem spune că acum IDE-ul este gata. Acum faceți clic pe bug din bara de instrumente de sus. Programul va începe să aștepte conectarea depanatorului și vom plasa câteva puncte de întrerupere în cod doar făcând clic în fața liniei cu cod:

Настраиваем XDEBUG в PHPSTORM

Acum nu mai rămâne decât să configurați browserul.Pentru Chrome, puteți descărca o extensie specială. Instalați-o și deschideți pagina pe care doriți să o depanați. Faceți clic pe pictograma extensiei și selectați Debug. Pictograma extensiei va deveni verde:

Настраиваем XDEBUG в PHPSTORM

Reîmprospătați pagina și reveniți la PHPStorm. Dacă totul a fost făcut corect, acolo va începe o sesiune de depanare. La prima rulare, programul vă poate cere să configurați căile fișierelor locale pentru a se potrivi cu căile fișierelor la distanță. Pentru serverul local nu trebuie să configurați nimic aici, trebuie doar să faceți clic pe Accept:

Настраиваем XDEBUG в PHPSTORM

După aceea, depanatorul va opri execuția la punctul de întrerupere selectat și interfața de depanare va apărea în program:

Настраиваем XDEBUG в PHPSTORM

Acum să înțelegem cum să configurăm Xdebug PhpStorm și Docker.

Depanarea PHP în DOCKER

Docker poate fi un pic complicat. Deoarece depanatorul trebuie să se conecteze la IDE-ul în sine, trebuie să redirecționați gazda către container. Pe Windows, acest lucru se poate face utilizând adresa host.docker.internal. Dar în Linux, acest lucru nu se întâmplă în mod implicit. Pentru a adăuga o astfel de adresă, trebuie să adăugați următoarele linii la docker-compose:

extra_hosts:

host.docker.internal: host-gateway

Utilizăm următoarea structură de directoare:

Настраиваем XDEBUG в PHPSTORM

Docker-compose.yaml minim necesar va arăta astfel:

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

Pur și simplu declarăm două containere, nginx și php-fpm. Nu facem nicio modificare la primul, deci putem lua doar imaginea oficială, să montăm folderul sursă, fișierul de configurare și port forward. În al doilea container este necesar să se instaleze și să se configureze Xdebug, deci va trebui să fie construit pe baza containerului php oficial. Pentru același container este necesar să se specifice directiva extra_hosts, fără ea nimic nu va funcționa. Configurarea Nginx este, de asemenea, destul de 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;
  }
}

Acesta este modul în care se configurează procesarea scripturilor PHP în containerul php-fpm și redirecționarea URL-urilor inexistente către index.php, ceea ce este destul de standard pentru multe framework-uri și CMS-uri. În fișierul Docker al containerului php-fpm, acesta arată astfel:

Instalați xdebug utilizând pecl, apoi copiați fișierul său de configurare în container. Fișier:

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 pentru PHP 8 este instalat în container, deoarece versiunea veche nu mai funcționează cu această versiune a limbajului, astfel încât este utilizată noua sintaxă de configurare. Ei bine gazdă, host.docker.internal, care obișnuia să fie prescrisă în docker-compose.yaml. Configurarea xdebug PHPStorm docker este acum completă. În continuare, puteți rula proiectul:

docker-compose up --build

Acum, ca și în opțiunea anterioară, puteți activa modul de depanare în browser, reîmprospătați pagina și depanatorul se va conecta cu succes la IDE, în ciuda faptului că se execută în Docker

Настраиваем XDEBUG в PHPSTORM