DEV Community

Cover image for Xdebug 3, Docker, Laravel, VScode
Jhonatan Morais
Jhonatan Morais

Posted on • Edited on

Xdebug 3, Docker, Laravel, VScode

Neste guia mostro uma das várias maneiras de configurar seu xdebug em um ambiente PHP com docker.

Configurar o xdebug sempre foi chato! mas não da pra codar sem ele e agora com sua versão 3 (que ficou excelente) e com docker as coisas ficaram bem mais fáceis. Vamos para a ação!

Imagem docker

Tenho uma imagem de estimação que uso pra trabalhar com docker em meu projetos laravel. Então ela e a base de minha configuração.

Instalação do xdebug 3

Depois de várias horas estudando essa foi a melhor configuração que cheguei :

trecho do meu dockerFile

[ ... outros comandos ... ] RUN yes | pecl install xdebug \ && docker-php-ext-enable xdebug \ && echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ && echo "xdebug.idekey=VSCODE" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ && echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ && echo "xdebug.remote_connect_back=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ && echo "xdebug.log=/var/www/html/xdebug.log" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ && touch /var/www/html/xdebug.log \ && chown developer:www-data /var/www/html/xdebug.log \ && chmod 775 /var/www/html/xdebug.log 
Enter fullscreen mode Exit fullscreen mode

Algumas explicações:

  • pecl install xdebug e docker-php-ext-enable xdebug Instala e habilita o xdebug 3 na minha imagem.
  • xdebug.mode=debug coloca o modo de debug desejado
  • xdebug.idekey=VSCODE coloca a chave personalizada utilizada no vscode.
  • xdebug.client_host=host.docker.internal define o host para o docker.
  • xdebug.log=/var/www/html/storage/logs/xdebug.log local para o arquivo de log do xdebug. Como estou utilizando laravel o coloquei nessa path pra evitar problemas de escrita.

Apenas esses parametros já instalam e configuram o xdebug no ambiente.

Atenção: Diversos tutoriais e post utilizam parametors das versões 2.x.x do xdebug que foram descontinuados ou que são redundantes. Sempre leia a documentação oficial para entender o objetivo de cada instrução.

Verificando se o xdebug 3 esta instalado

Método 1 - Modo texto

Com o container rodando entre no bash do mesmo e execute php -i | grep xdebug a saída deve ser algo assim:

jhonatan@desktop:~/git/my_project$ docker exec -it my_container bash root@e466f2d7bd63:/var/www/html# php -i | grep xdebug /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini, xdebug Support Xdebug on Patreon, GitHub, or as a business: https://xdebug.org/support Enabled Features<br/>(through 'xdebug.mode' setting) [.. várias variáveis aqui ...] 
Enter fullscreen mode Exit fullscreen mode

Método 2 - Modo gráfico

Assim como temos o phpinfo() para ver a configuração do php temos o xdebug_info(). Basta colocar ele num script e o resultado visual vai aparecer como o exemplo abaixo:

Config gráfica do xdebug

Atenção: Observe a seção Diagnostc log é nela que serão apresentadas as mensagem de erro e que estarão impedindo seu debug de funcionar. Essa seção é sua melhor amiga e vai te ajudar a identificar seus problemas.

Configuração da extensão do navegador.

Basicamente temos 3 configurações pra debugar:

  1. O modo script/terminal. que não é o foco desse guia.
  2. O modo 'toda debuga toda request' que torna seu ambiente lento pois toda e qualquer request vai iniciar usar o modo debug, pra ativa-la se usa o parâmetro: xdebug.start_with_request=yes.
  3. O modo com extensão que só usa o debug SE a extensão estiver ativada (besouro verde) E o modo debug habilidato no vscode. É esta que utilizaremos neste guia.

Para instalar a extensão em navegadores baseados em chrominium (chrom e edge) utilize esse link. Para demais navegadores veja na doc oficial

Para ativar a extensão:

  1. Clique no besouro com o botão direito e va em opções.
  2. Selecione a opção others e coloque a chave como VSCODE (que é o mesmo valor que passamos para o xdebug.idekey la em nosso dockerfile) e salve.

Exemplo para configuraçao da extensão de debug

Configuração no VSCode.

Extensão de debug do vscode

Ativando breakpoints

  1. Vá em File > preferences > settings
  2. Na tela de Settings vá em Features > Debug
  3. Habilite a opção Allow setting breakpoints in any file.

Configurando o debug

  1. Clique no contexto de debug do VScode (fica no side menu do lado esquerdo)
  2. Clique para criar o arquivo launch.json
  3. Essa é a minha configuração:
{ "version": "0.2.0", "configurations": [ { "name": "Listen for XDebug", "type": "php", "request": "launch", "hostname": "0.0.0.0", "port": 9003, "log": true, "pathMappings": { "/var/www/html": "${workspaceFolder}" }, "ignore": ["**/vendor/**/*.php"], "xdebugSettings": { "max_children": 10000, "max_data": 10000, "show_hidden": 1 } }, { "name": "Launch currently open script", "type": "php", "request": "launch", "program": "${file}", "cwd": "${fileDirname}", "port": 9000 } ] } 
Enter fullscreen mode Exit fullscreen mode

Atenção: Observe o parametro "hostname": "0.0.0.0", esse é a config que me salvou. sem ela você vai receber o erro abaixo a todo momento pois o host docker não estará mapeado. exemplo dos recebidos por mapeamento incorreto entre host/docker/vscode:

  • [Step Debug] Time-out connecting to debugging client, waited: 200 ms. Tried: host.docker.internal:9003 (through xdebug.client_host/xdebug.client_port) :-( ou
  • [Step Debug] Time-out connecting to debugging client, waited: 200 ms. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port) :-(

Docker-compose e Video demostrativo

Pra facilitar mais e ver tudo em funcionamento adicionei esse video demostrativo e com umas explicações a mais.

Caso vocês queira utilizar a mesma imagem que eu uso aqui esta a docker-compose.yml

version: "3" services: backend: container_name: backend image: getjv/php-apache restart: always ports: - "80:80" volumes: - .:/var/www/html environment: - DOCUMENT_ROOT_CONTEXT=public - ALLOW_OVERRIDE_OPTION=All - APPLICATION_ENV_OPTION=development 
Enter fullscreen mode Exit fullscreen mode

Conclusão e preview de uso.

Pronto! com isso você já deve ter o debug funcionando. Ligue o debug no navegador e no vscode, coloque seus breakpoints e seja feliz.

Espero que estas infos tenham sido úteis. Lembre-se de compartilhar em suas redes certamente vai ajudar muita gente que tem o mesmo problema que você.

Compartilhe sempre o que é bom! e dê crédito aos seus autores.

Segue o preview:

preview do debug em uso

Referências

Top comments (9)

Collapse
 
zobo profile image
Damjan Cvetko

Great article, although I', not exactly sure why the hostname would be required - since by default it should listen on 0.0.0.0. (nodejs.org/api/net.html#net_server...)

I've posted an article regarding the latest release of vscode-php-debug extension: dev.to/zobo/vscode-php-debug-relea...

Collapse
 
getjv profile image
Jhonatan Morais

Hi DamJam I'm Glad you liked. Thank you for the feedback.
That's true, but even the hostname listen 0.0.0.0 I like to 're-force' some crutial default configs params. It's tick from the 2000's hehe.

Collapse
 
goodnato profile image
Renato Alves

Oi amigo. Fiz exatamente que voce fez mas meus breakpoints nao funcionam :(

Pelos logs você consegue ver se está tudo certo? Eu nunca consegui fazer o debug funcionar com docker pode me ajudar PF?

Se precisar falar comigo tem meu twitter @goodnato ou meu discord Goodnato#8053

Obrigado

Collapse
 
getjv profile image
Jhonatan Morais

Fala Renato. Antes tarde do que nunca.
cara realmente configurar o xdebug e bem chatinho e acredite antes era bem pior.
Eu atualizei o post com novas infos e tbm coloquei um video mostrando como tudo funciona.
youtube.com/watch?v=s-ot-Zh8LRQ

Caso vc assim como eu esteja usando windows + wsl2, tem ocorrido uns erros de rede interna do docker a atrapalha. Mas geralmente reiniciar a maquina resolve.

Pela imagem que vc mandou, parece ser exatamente isso.

Collapse
 
goodnato profile image
Renato Alves
Collapse
 
devatreides profile image
Tom Benevides

Eu li muita coisa mas o seu artigo tá demais amigo, funcionou perfeitamente \o/

Collapse
 
getjv profile image
Jhonatan Morais

Que satisfação esse comentário. Fico feliz que ajudou.
esse xdebug é chato de configurar mas não da pra codar sem ele. hahaha

Collapse
 
devatreides profile image
Tom Benevides

hahah'... correção: "ele era chato de configurar" pq eu fiz rapidinho seguindo seu artigo. Eu tive que mexer só em algumas coisas nos parâmetros do xdebug.ini tipo: "remote_connect_back" mudei pra "discover_client_host", tive que adicionar o "start_with_request=trigger" (que é o equivalente do "remote_mode") mas fora isso foi tudo belezinha... e a doc do XDebug ajuda também, vi tudo aqui:

xdebug.org/docs/upgrade_guide

Eu não conhecia essa ferramenta... um amigo do trabalho que apresentou e cara, ela é demais mesmo ( :

Collapse
 
richellyitalo profile image
Richelly Italo

Excelente Jhonatan.
Muito obrigado!