Cursos Magento

Xdebug: entenda como funciona e como resolver problemas na sua configuração

,

Atualizado em 02 de agosto de 2023

Xdebug é uma extensão PHP. Ela permite que aplicações desta linguagem se conectem a uma IDE, permitindo pausar e depurar a mesma em tempo de execução.

Apesar de ser uma ferramenta quase indispensável na vida do desenvolvedor moderno, quase ninguém usa. 🤯

A desculpa é sempre a mesma: “nunca consigo configurar”. Tanto para usuários do PhpStorm como aqueles que usam Visual Studio Code (VsCode).

Neste artigo vamos entender melhor como ele funciona. Também vamos ver como configurar e como resolver problemas comuns da sua configuração.

Para os fins deste artigo, usaremos o XDebug 3.

Como o Xdebug funciona

Esteja você usando o PHP no Docker, WSL, ou mesmo na sua própria máquina, é importante que a extensão do XDebug esteja ativada.

Somente assim ele poderá funcionar junto com seus arquivos PHP em tempo de execução.

Uma vez que ele é executado e está ativo, ele se conectará à máquina especificada em xdebug.client_host no seu PHP.

Como saber se o Xdebug está ativo

Para saber confirmar se a extensão está ativa no php, basta digitar php -v.

Com isso podemos ver não apenas a versão do PHP mas também se o Xdebug foi iniciado.

php -v mostrando que o xdebug está ativo

No entanto, sua extensão pode estar carregada, mas pode não estar ativada.

Configurações do Xdebug. Onde e como mudar.

Uma vez que a extensão está carregada, é preciso realizar configurações adicionais. Você precisará especificar:

  • quando o xdebug deverá interceptar a execução do código
  • para qual máquina ele deve enviar informações
  • em que porta
  • entre outras coisas 🙂

Todas estas configurações podem ser definidas no php.ini ou em arquivos de configuração .ini carregados adicionalmente.

Ao digitar php -i | grep -i xdebug você terá uma lista das configurações carregadas por ele.

Veja alguns exemplos:

$ php -i | grep -i xdebug
xdebug.auto_trace => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.cli_color => 0 => 0
xdebug.client_discovery_header => no value => no value
xdebug.client_host => host.docker.internal => host.docker.internal
xdebug.client_port => 9003 => 9003
xdebug.cloud_id => no value => no value
...

Geralmente um arquivo .ini é carregado separadamente com as configurações do xdebug. Basta alterar este arquivo e reiniciar o servidor web para alterá-las.

Você também pode adicionar/mapear um novo arquivo .ini a um dos diretórios que o PHP busca arquivos de configuração.

Para listar esses diretórios, basta digitar php --ini, como no exemplo abaixo.

php --ini mostrando arquivos ini adicionais

Sendo assim, ao adicionar um arquivo .ini a um dos diretórios marcados em verde acima, você pode alterar as configurações e parâmetros do xdebug. Exemplo:

xdebug.mode=debug

Isso iria alterar o valor da configuração do parâmetro xdebug.mode. Para confirmar se a configuração foi aplicada, digite php -i | grep -i xdebug.mode. Lembre-se de reiniciar seu servidor web todas as vezes que alterar uma configuração php.

Xdebug e suas configurações ideais iniciais

Sempre que estou iniciando a configuração do Xdebug em um projeto, faço ela de forma a ter ele sendo executado em todas as requisições. Isto porque podemos configurar o Xdebug para ser iniciado somente no caso da existência de determinado cookie. Mas isso abriria margem para erros na configuração do navegador.

Sendo assim, faço sempre uma safe config antes de otimizar a forma como vou iniciá-lo.

No Xdebug 3, costumo deixar meu .ini acima da seguinte forma:

xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.discover_client_host=0
xdebug.client_host=host.docker.internal
xdebug.port=9003
xdebug.connect_timeout_ms=2000
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.discover_client_host=1
xdebug.client_host=localhost
xdebug.port=9003
xdebug.connect_timeout_ms=2000

Acima você viu os exemplos de configuração do xdebug com e sem o uso de docker. No segundo caso, o xdebug tentará identificar o ip da máquina do desenvolvedor, e se não conseguir, usará o client_host especificado.

Também costumo aumentar o timeout para 2 segundos nas primeiras execuções e até ter certeza que está tudo funcionando.

Você pode ver uma lista de todas as configurações possíveis neste link.

Configuração do VsCode com Xdebug 3

Para configurar o Xdebug no Visual Studio Code da Microsoft você precisará de uma ou duas extensões adicionais.

Extensão PHP Debug VsCode

O primeiro passo é fazer download da extensão oficial do Xdebug, chamada PHP Debug.

Se você estiver utilizando WSL2, também precisará da extensão WSL da Microsoft.

Extensão WSL VsCode

Depois clique em Run and Debug (Ctrl + Shift + D); Show all automatic debug configurations; Add configuration; e selecione PHP.

Configurando Xdebug no Visual Studio Code

Um arquivo .vscode/launch.json será criado em seu projeto. Dentro dele, você verá uma configuração com o nome “Listen for Xdebug”. Certifique-se que a porta configurada é a mesma que configurou acima, no PHP.

Se estiver usando Docker, também precisará configurar o “pathMappings” e “hostname”, como mostrado na imagem abaixo.

Arquivo launch.json do VsCode

O pathMappings deve mapear as pastas que estão no servidor docker (lado esquerdo) com aquelas da sua máquina, em seu projeto atual (lado direito).

Para usuários Windows e WSL

Se estiver usando WSL, também precisará liberar ele no Windows Defender. Para isso, execute o PowerShell como administrador e digite o comando abaixo:

New-NetFirewallRule -DisplayName “WSL” -Direction Inbound -InterfaceAlias “vEthernet (WSL)” -Action Allow

Isso criará uma nova regra chamada “WSL” no seu Windows Defender.

Windows Defender com WSL

E pronto. Basta adicionar um breakpoint em alguma linha, e iniciar a escuta do Xdebug clicando em Run and Debug (Ctrl + Shift + D) e clicand no Play (Listen for Xdebug…).

No PhpStorm

Para configurar o Xdebug no PhpStorm da Jetbrains é bem mais fácil e nenhuma extensão adicional é necessária. As liberações do firewall são quase automáticas e são solicitadas e configuradas pelo próprio PhpStorm. Basta autorizar quando for pedido.

O primeiro passo é se certificar que a IDE está configurada para escutar a porta configurada no php.ini (como vimos acima).

Isso é feito nas configurações da IDE em PHP > Debug > Debug port.

Configurações do PhpStorm e Xdebug

Opcionalmente marque a opção “Break at first line in PHP Scripts”. Ao menos enquanto configura o xdebug pela primeira vez em seu projeto.

Isso é suficiente para a maioria dos projetos não-docker.

Basta clicar no ícone de debug para começar a escutar conexões, deixando-o verde.

Ícone de debug PhpStorm

Se estiver usando Docker, precisará mapear uma variável de ambiente PHP_IDE_CONFIG com o nome do servidor configurado no PhpStorm, como mostro nas imagens abaixo.

services:
  phpfpm:
    volumes: *appvolumes
    environment:
      PHP_IDE_CONFIG: "serverName=MeuDocker"
Configurações de Server Mapping do PhpStorm

Troubleshooting: Como saber se o servidor consegue se conectar ao Xdebug?

É comum que problemas de firewall, rede, ou mesmo da IDE impeçam o sucesso da nossa configuração Xdebug.

Uma forma simples de testar isso é usando o netcat e ping na máquina que está executando nossa aplicação PHP.

Em máquinas linux, ou docker, você talvez precise instalar estas ferramentas. Para isso, digite:

sudo apt update && sudo apt install -y inetutils-ping netcat

Depois, para testar, certifique-se que sua IDE (PhpStorm, VsCode, etc) está escutando e esperando conexões Xdebug.

Por fim, no servidor da aplicação, digite:

# nc -vz host.docker.internal 9003
Connection to host.docker.internal (192.168.65.254) 9003 port [tcp/*] succeeded!
# ping host.docker.internal
PING host.docker.internal (192.168.65.254): 56 data bytes
64 bytes from 192.168.65.254: icmp_seq=0 ttl=62 time=1.617 ms
64 bytes from 192.168.65.254: icmp_seq=1 ttl=62 time=1.768 ms

Ambos os comandos devem mostrar alguma forma de sucesso ao se conectar na máquina do desenvolvedor. Se isso não acontecer, é possível que algo esteja errado.

No lugar de host.docker.internal use o host configurado no php.ini, como vimos acima.

Note que, em alguns casos, o comando acima apenas mostrará que a conexão está aberta (open), o que já é suficiente.

Onde obter mais detalhes? E o Debug com Magento?

Você pode assistir a uma live que fiz sobre o assunto no vídeo abaixo.

Se preferir, também temos uma seção completa sobre Docker e Docker no Windows, no Magento 2: O Curso (do Magenteiro.com).

Espero que tenha gostado. Mais que isso, espero nunca mais ver você usando um echo "passou aqui";.

Se puder, compartilhe este artigo com outros desenvolvedores que ainda fazem isso.

Grande abraço e até a próxima.

Últimos posts por Ricardo Martins (exibir todos)
Comentários

Deixe seu comentário

[fbcomments url="https://www.magenteiro.com/blog/magento-2/desenvolvimento-m2/xdebug-phpstorm-vscode-como-configurar/"]