Makseviisid Abuse

Xdebug'i seadistamine PHPStormis

07.05.2021, 22:28

Vigade kõrvaldamine on üks tähtsamaid protsesse programmeerimisel. Debuggeri abil saab näha, mis programmis toimub, milliseid funktsioone täidetakse, mis on salvestatud muutujatesse, samuti saab kõike samm-sammult läbi viia ja täpselt aru saada, millisel real ja milliste muutujate väärtuste juures viga esineb.

Näiteks PHP puhul kasutatakse Xdebug deebuggerit, PHPStorm on üks populaarsemaid arenduskeskkondi. Järgnevalt vaatame, kuidas konfigureerida Xdebug PhpStormis silumiseks kohalikus arvutis ja Dockeris.

XDEBUGi konfigureerimine PHPSTORMis

Räägime sellest, kuidas toimub silumine lokaalses serveris.

Vaatame kogu protsessi Ubuntu ja Apache'iga konfigureeritud PHP interpretaatori näitel. Teiste konfiguratsioonide puhul võivad failiteed olla erinevad, kuid mõte on sama. Xdebug'i silur võimaldab peatada koodi täitmist, vaadata kutsete virna ja muutujate sisu. Selle ainus puudus on see, et puudub mugav kontroll-liides. Debugimise haldamiseks kasutatakse tavaliselt IDE-d. Kuid IDE ei saa öelda silurile, et ta alustaks silumist, sest ta vastutab ainult koodi eest. Selleks on vaja Debug Helper brauseripikendust, mille abil saab lubada silumisrežiimi.

Kõigepealt tuleb paigaldada Xdebug. Selleks käivitage:

$ sudo apt install xdebug

Kui Xdebug'i paigaldamine on lõpetatud, tuleb programm konfigureerida nii, et see üritab silumise seansi käivitamisel meie IDE-ga ühendust võtta, et kontrollida silumist. Selleks lisage need read faili /etc/php/7.4/apache2/conf.d/20-xdebug.ini Xdebug 2 versioonis:

$ 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

Uuema versiooni puhul on parem kasutada teistsugust formaati:

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

Vaatame seadistusi lähemalt. Esimene parameeter xdebug.mode - silumisrežiim, võimalikud valikud on:

  • develop - võimaldab lisainfo väljastamise, tühistab var_dump;

  • debug - rea kaupa koodi täitmise režiim, seda režiimi vajame antud juhul;

  • profile - profileerimine;

  • trace - programmi täitmisejälgimine.

Mitu režiimi on samaaegselt lubatud, kui need on loetletud komadega. Teine rida xdebug.start_with_request määrab, kuidas debugger käivitatakse debug, trace ja sarnaste režiimide puhul:

  • yes - alati, kui käivitatakse php skripte;
  • no - käivitatakse ainult koodist, mis kasutab spetsiaalseid funktsioone;
  • trigger - taotluse korral, kasutades spetsiaalset muutujat $_ENV, $_POST, $COOKIE või muud massiivi. See valik sobib antud juhul kõige paremini, et silur ei käivituks siis, kui seda pole vaja.

Kolmas xdebug.discover_client_host on seatud väärtuseks true, mille puhul xdebug üritab ühendust võtta HTTP_X_FORWARDED_FOR päises edastatud hostiga. Kuna host on määratud järgmises reas, ei ole see funktsioon antud juhul vajalik. Järgmisena on kliendihost, millega debugimise kontrollimiseks ühenduda, 127.0.0.1 ja port 9000. See on hetkel PhpStormis kasutatav vaikimisi port. Pärast seadete salvestamist tuleb Apache taaskäivitada, kasutades selleks spetsiaalset käsku:

$ sudo systemctl restart apache2

Järgmisena tuleb konfigureerida PhpStorm. Käivitage programm, seejärel avage menüü Run -> Edit Configurations. Teile avaneb aken, kus tuleb konfigureerida silur.

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

Klõpsake nupule + ja valige avanevast nimekirjast PHP Remote Debugger:

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

Ärge muutke seadetes midagi, määrake lihtsalt selle silumismeetodi nimi. Kui te ei määra serverit, kust ühendusi oodatakse, võetakse vastu kõik ühendused.

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

Kui soovite muuta porti, millega Xdebug ühendub, avage File -> Settings -> PHP -> Debug -> DBGp Proxy. Siin saate määrata soovitud pordi.

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

Võime öelda, et nüüd on IDE valmis. Nüüd klõpsake ülemisel tööriistaribal veale. Programm hakkab ootama, et debugger ühenduks ja me paneme koodile mõned breakpoints, klõpsates lihtsalt koodiga rea ees:

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

Nüüd on jäänud vaid brauseri konfigureerimine.Chrome'i jaoks saab alla laadida spetsiaalse laienduse. Installige see ja avage lehekülg, mida soovite siluda. Klõpsake laienduse ikoonil ja valige Debug. Laienduse ikoon muutub roheliseks:

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

Värskendage lehte ja minge tagasi PHPStormi. Kui kõik oli õigesti tehtud, algab seal silumisseanss. Esimesel käivitamisel võib programm paluda teil konfigureerida kohalikud failiteed, et need vastaksid kaugfailide teedele. Kohaliku serveri puhul ei pea siin midagi konfigureerima, vajutage lihtsalt nuppu Accept:

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

Pärast seda peatab silumisprogramm täitmise valitud katkestuspunktis ja programmis ilmub silumisliides:

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

Nüüd mõistame, kuidas konfigureerida Xdebug PhpStormi ja Dockeri.

PHP silumine DOCKERis

Docker võib olla natuke keeruline. Kuna silur peab ühenduma IDE-ga ise, tuleb konteinerile edastada vastuvõtja. Windowsis saab seda teha, kasutades aadressi host.docker.internal. Kuid Linuxis ei toimu seda vaikimisi. Sellise aadressi lisamiseks tuleb docker-compose'ile lisada järgmised read:

extra_hosts:

host.docker.internal: host-gateway

Kasutame järgmist kataloogistruktuuri:

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

Minimaalselt vajalik docker-compose.yaml näeb välja selline:

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

Me lihtsalt deklareerime kaks konteinerit, nginx ja php-fpm. Esimeses me ei tee mingeid muudatusi, seega võime lihtsalt võtta ametliku image'i, monteerida lähtekausta, konfiguratsioonifaili ja portide edastamise. Teises konteineris on vaja installeerida ja konfigureerida Xdebug, seega tuleb see ehitada ametliku php konteineri põhjal. Sama konteineri jaoks on vaja määrata extra_hosts direktiiv, ilma selleta ei tööta midagi. Nginxi konfiguratsioon on samuti üsna standardne:

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;
  }
}

Nii konfigureeritakse PHP-skriptide töötlemine php-fpm konteineris ja suunatakse mitteolemasolevad URL-id ümber index.php-le, mis on üsna standardne paljude raamistike ja CMS-i puhul. Dockerfile'is näeb php-fpm konteiner välja nii:

Paigaldage xdebug kasutades pecl ja seejärel kopeerige selle konfiguratsioonifail konteinerisse. Faili:

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 paigaldatakse konteinerisse, sest vana versioon ei tööta enam selle keeleversiooniga, seega kasutatakse uut konfiguratsiooni süntaksit. Noh host, host.docker.internal, mis varem oli ette nähtud docker-compose.yamlis. xdebug PHPStormi dokkeri konfigureerimine on nüüd valmis. Järgmisena saate projekti käivitada:

docker-compose up --build

Nüüd, nagu eelmises variandis, saate lubada brauseris debugirežiimi, värskendada lehte ja debugger ühendub edukalt IDE-ga, hoolimata sellest, et see töötab Dockeris

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