DevSecOps

26 out, 2017

Como usar o XDebug dentro de um container Docker

Publicidade

Introdução

Quando escuto sobre debug em PHP:

“É muito difícil de debugar”, “Preciso escrever código de debug utilizando funções como var_dump() e die()” e entre outras coisas. Mas não precisa ser assim.

Então vamos debugar em PHP, sem a necessidade de escrever códigos como: var_dump, dump, dd e die utilizando Docker.

Docker install

Antes de mais nada, precisamos ter o Docker instalado no PC. Para instalar o Docker, vá para a documentação em (https://docs.docker.com/engine/installation/) e siga os passos.

Phpdocker.io

Precisamos criar um conteiner do Docker com php-fpm e a extensão do xdebug instalada. Para isso, podemos utilizar o phpdocker.io que cria automaticamente para nós.

Na verdade, é bem simples, acesse a página do phpdocker.io (https://phpdocker.io/generator) e escolha as opções desejadas. As configurações são categorizadas em Global, PHP, Database e Zero-config.

Na aba global você precisa escolher apenas o nome do projeto e a porta. Para o nome do projeto, utilize “xdebug-docker”. Por exemplo, em application type, podemos utilizar o default (Generic: Zend, Laravel, Lumen,etc). Para a porta padrão, pode-se utilizar :80, ou qualquer outra que quiser. Nesse projeto é utilizada a porta :8200. E para o max upload size, você pode manter o padrão também (100MB).

Para a configuração do PHP, você pode utilizar a versão 7.1. Não há necessidade de instalar o Git e selecione a extensão do XDebug.

Não é necessária nenhuma configuração de database ou zero-config para esse projeto, podendo mantê-los com as opções padrão.

Dockerfile and docker-compose.yml

Precisamos configurar o arquivo docker-compose.yml e o Dockerfile. Por hora, podemos abrir o /phpdocker.io/php-fpm/Dockerfile em qualquer editor.

FROM phpdockerio/php71-fpm:latest
WORKDIR "/application"

# Install selected extensions and other stuff
RUN apt-get update \
    && apt-get -y --no-install-recommends install  php-xdebug \
    && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*

Precisamos colocar as configurações do XDebug nesse arquivo. Lembre-se de adicionar uma barra invertida () após doc/* na ultima linha, antes de adicionar as linhas abaixo:

&& echo "zend_extension=/usr/lib/php/20160303/xdebug.so" > /etc/php/7.1/mods-available/xdebug.ini \
    && echo "xdebug.remote_enable=on" >> /etc/php/7.1/mods-available/xdebug.ini \
    && echo "xdebug.remote_handler=dbgp" >> /etc/php/7.1/mods-available/xdebug.ini \
    && echo "xdebug.remote_port=9000" >> /etc/php/7.1/mods-available/xdebug.ini \
    && echo "xdebug.remote_autostart=on" >> /etc/php/7.1/mods-available/xdebug.ini \
    && echo "xdebug.remote_connect_back=0" >> /etc/php/7.1/mods-available/xdebug.ini \
    && echo "xdebug.idekey=docker" >> /etc/php/7.1/mods-available/xdebug.ini

Essas linhas adicionam algumas configurações para o XDebug no php.ini. Vamos ver o que cada configuração faz?

  • remote_enable: Se ativa, tenta conectar com um Client, que você pode configurar usando remote_host e remote_port. Se a conexão falhar, essa opção é automaticamente desabilitada.
  • remote_handler: seleciona o output do debugger, após a versão 2 a opção precisa ser DBPG, caso deseje saber mais sobre o common debugger protocol veja https://xdebug.org/docs-dbgp.php().
  • remote_port: configura a porta de conexão do xdebug, o default é 9000.
  • remote_autostart: Se true, o XDebug tentará inicializar e conectar com o host remoto.
  • remote_connect_back: Se true, essa opção ignora o remote_host e vai tentar se conectar com o Client usando o IP de origem da requisição utilizando os cabeçalhos ($_SERVER[‘HTTP_X_FORWARDED_FOR’] e $_SERVER[‘REMOTE_ADDR’]).
  • idekey: Controla qual IDEKey o XDebug deve passar para o handler do DBGp.

Se você quiser saber mais sobre a configuração do XDebug, veja: https://xdebug.org/docs/all_setting.

Construa seu container:

    docker-compose up --build

Depois de construir o container, edite o arquivo docker-compose.yml, configurando o ambiente para o serviço php-fpm.

Configuramos o XDebug utilizando a chave (XDEBUG_CONFIG). Precisamos então configurar o remote_host que vai receber como valor o endereço de IP da rede do Docker.

E para o PHPStorm, utilizaremos a chave (PHP_IDE_CONFIG). Precisamos configurar uma variável de ambiente “serverName” que será a conexão que a IDE vai escutar o XDebug.

Se ainda existirem dúvidas sobre como você pode obter o IP do seu Docker, veja: (https://linux.die.net/man/8/ifconfig) se for Linux ou (https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ipconfig.mspx) caso seja Windows.

Se não for utilizar PHPStorm, não há necessidade de utilizar PHP_IDE_CONFIG.

environment:
        XDEBUG_CONFIG: remote_host=172.17.0.1 #docker network ip.
        PHP_IDE_CONFIG: "serverName=xdebug-docker" #phpstorm variavel de ambiente com o nome do server configurado.

Reinicie seu container.

 docker-compose down
    docker-compose up -d

Nesse tutorial, você pode usar Microsoft Visual Studio Code ou Jetbrains PHPStorm.

Escolha seu editor favorito!

Visual Studio Code

No VSC, clique em debug na barra de menu ou use a tecla de atalho F5 e escolha a opção PHP. O Editor vai criar um arquivo /.vs/launch.json. Abra-o e coloque as seguintes configurações:

  "serverSourceRoot": "/application/public",
    "localSourceRoot": "${workspaceRoot}/public"

Crie um arquivo de hello world em /public/index.php:

<?php
$hello = "Hello World";
echo $hello;

Para adicionar um break point no Visual Code, clique com o botão direito e selecione a opção “Add Column Breakpoint” ou clique na coluna à esquerda, antes do número da linha.

Finalmente clique no ícone de Play verde “Listen for XDebug no canto superior esquerdo e acesse http://127.0.0.1:8200 no seu navegador – use a porta que você configurou anteriormente, e pronto.

PHPStorm

No PHPStorm, vá para: File -> Settings -> Languages & Frameworks -> PHP -> Server. E crie um servidor com o mesmo nome que você configurou no docker-compose.yml. Configure também seus path mappings.

Crie um arquivo de hello world em /public/index.php:

<?php
$hello = "Hello World";
echo $hello;

Para iniciar o debug, vá até Run -> Start listening for PHP debug connections e adicione um breakpoint no PHPStorm clicando na coluna lateral antes do número da linha.

Execute no navegador: http://127.0.0.1:8200, ou utilize a porta que você escolheu anteriormente.

E pronto!

Conclusão

Isso é tudo, pessoal. Agora sabemos como utilizar a extensão do PHP XDebug dentro de um container do Docker.

Até mais!