Ambiente de Desenvolvimento Virtual com Debugging e UnitTests no PhpStorm

Salve pessoal!

Você desenvolve em PHP e usa uma máquina virtual ou uma máquina externa como ambiente de desenvolvimento? Se você quiser debugar sua aplicação em tempo real com este ambiente remoto como você faz? Ou mesmo rodar testes unitários sob esse ambiente? Vamos começar com um desafio “simples”: montar um ambiente de desenvolvimento suportando PHP baseado com acesso Remoto. Para tal vamos utilizar o VirtualBox, PHP 5.5 com PHPUnit e Xdebug e, óbvio, o PhpStorm.

O Cenário

Quando estamos desenvolvendo localmente é relativamente fácil configurar o ambiente de desenvolvimento PHP – Apache, Mysql, PHP, Xdebug – simplesmente estão ali desfrutando de todo seu ambiente.

Quando desenvolvemos para um ambiente remoto temos os arquivos localmente para edição mas os mesmos são executados por outra configuração, sistema operacional, servidores, enfim… devemos adaptar o acesso a tudo que usamos para configurações além de “localhost”.

O Foco deste artigo é como configurar o PhpStorm para utilizar o Xdebug e o PHPUnit em um ambiente remoto – mesmo que este ambiente seja uma Virtual Machine (VM) rodando em seu computador. Este artigo deve abranger os 2 casos.

Para referência nesse artigo vamos usar o IP 192.168.56.1 como host local e 192.168.56.102 como host remoto (que tem o alias dev.local).

Problema #1: Acesso aos arquivos

Lembre-se: você desenvolve/codifica localmente mas executa remotamente. Idealmente o host remoto de desenvolvimento deve ter acesso aos arquivos locais e não o contrário para fins de confiabilidade de seu código – o servidor remoto não deve alterar arquivos. Isso simula também o ambiente de produção, onde não há edição de código (se você riu ao ler isso, está fazendo algo errado em sua aplicação ;] ).

Solução #1: Montando os arquivos

Aqui, para quem já está trabalhando remotamente, talvez não haja muita novidade. Você pode compartilhar seu diretório de projetos e montar na máquina remota. Você pode usar NFS, Compartilhamento Windows/Samba … Se você usa VirtualBox, você pode instalar os Adicionais de Convidado e realizar a montagem por um protocolo da própria ferramenta, mais rápido e sem interferir com a rede.

No nosso exemplo meus arquivos de desenvolvimento locais estão em ~/Projects/sample-todo-app e monto esse diretório em /mnt/Projects/sample-todo-app com vboxsf em dev.local.

Problema 2: Xdebug

Mas aí vem o segundo problema: o debugger (Xdebug no caso) tem que funcionar na máquina remota e sua IDE precisa identificar os arquivos localmente através das chamadas de debug para que você, o desenvolvedor, possa analisar os detalhes desta execução.

Solução #2: Mapear a instalação remota no PhpStorm

Estou assumindo que você tenha o Xdebug instalado (para verificar a partir do terminal execute php -m; se encontrar “Xdebug” ele já está lá). Caso não o tenha deixarei no fim do artigo alguns links para te orientar a fazê-lo.

Vamos editar a configuração do Xdebug. No unix execute php -i |grep "/.*xdebug.ini\|/php.ini"; se alguma linha com xdebug.ini for retornada, edite-a; do contrário edite o php.ini e procure pela seção do xdebug. Ao editá-lo, procure pelas diretivas correspondentes e modifique-as, ou adicione ao arquivo caso elas não existam:

xdebug.remote_enable=1; 
xdebug.remote_host=192.168.56.1;
xdebug.remote_port=9000;

Reinicie o webserver (ou o FPM se você estiver utilizando-o) e o PHP estará pronto para ser debugado. Lembre-se de abrir a porta 9000 se o ambiente remoto (virtual) estiver usando um firewall. Ainda se estiver usando o FPM por host você deve ou modificar sua porta de execução, ou mudar o do Xdebug (comprometendo o acompanhamento a partir desse artigo).

Já no PhpStorm, acessando as configurações via File > Settings navegue por Project Settings > PHP > Servers. Lá vamos adicionar um novo servidor clicando no “+” verde:

Dado isso, vamos à configuração:
– Name: dê um nome ao servidor (deixei como dev.local)
– Host: dev.local
– Port: 80
– Debugger: Xdebug

Então vamos validar a configuração clicando em Validade remote environment. A seguinte janela será exibida:


Vamos configurar um novo Deployment server clicando na caixa com “…” à direita, e a interface para sua criação será exibida. Vamos criar um novo clicando em “+”, dando um nome ao mesmo e selecionando seu tipo – no nosso caso vamos selecionar “In place”, deixando implícito que toda a configuração de acesso aos arquivos já está pronta (como dito na Solução #1).

Na aba Connection você deve editar o campo Web server root url para adequar-se ao seu host – no meu caso http://dev.local/. Na imagem a seguir vemos a aba Mappings; devemos apontar qual é o diretório em nosso projeto que reflete o document root web de nosso projeto. Os grandes frameworks e projetos mantém sempre um diretório separado somente para o servidor web, por organização e segurança.

Clicamos em Ok  e voltamos a interface de validação de Debug. Aqui, se você tem em seu projeto esse diretório separado você deve alterar também o campo Local path to create validation script. Clique em Validate e se tudo estiver correto você terá as informações do debugger:

Clique em Cancel para sair da validação. Faz-se necessário também o mapeamento entre arquivos locais e do servidor. Na interface para gerenciamento de Servidores PHP, assinale a opção Use path mappings e ligue a raiz do seu projeto ao path relativo no servidor remoto.O Xdebug enviará para o cliente (o PhpStorm no caso) o path interno (do servidor remoto) e o cliente deve saber encontrar o arquivo para exibir corretamente a informação de debug.

E estamos prontos para uma sessão de debug remota! Basta Acionar o listener em Run > Start Listen for PHP Debug Connections (ou clicar em seu atalho na barra principal do PhpStorm) e iniciar sua sessão Xdebug. Aqui você pode fazer de diferentes maneiras: usar um parâmetro a mais na requisição (XDEBUG_SESSION_START), um cookie, uma extensão de browser (aqui temos algumas) ou mesmo configurar o Xdebug para sempre iniciar uma sessão – fica a seu critério.

Problema #3: PHPUnit na máquina remota

Seguindo com a lista de problemas: sua aplicação tem testes unitários, o que é excelente. Mas você deve rodar os testes sob o ambiente remoto e não o local. Um bom motivo para isso é a própria necessidade do uso da VM em si, ter um ambiente similar ao de produção, que é diferente do seu local (principalmente se você trabalha em Windows ou OSX e tem um Linux em produção).

Solução #3: Fazer o PhpStorm rodar os testes e exibir os resultados

Acesse as configurações do projeto (File > Settings) e selecione PHP. Em Interpreter clique em “…” e na janela de configuração de interpretadores clique no “+” verde e selecione remote e a seguinte janela será apresentada:

snapshot

Preencha com a configuração que mais adapta-se à sua situação – no nosso exemplo essa é a mais adequada. Confirme e nomeie esta configuração. De volta à janela principal das configurações do projeto, selecione a configuração que acabou de criar como Interpretador padrão e confirme clicando em Ok.

Agora vamos configurar a execução do PHPUnit: Acesse Run > Edit Configurations… , clique no “+” verde e selecione PHPUnit. Nomeie esta configuração, selecione seu diretório de testes e clique em Ok. Agora basta usar Shift + F10 (Control + R no Mac) para executar o PHPUnit – sim, já no servidor remoto. Fácil não?

Um bom efeito colateral dessa configuração é que qualquer execução configurada com esse interpretador será executada no servidor. Se não quiser esse comportamento basta configurar mais um interpretador local e alternar entre eles. Esta configuração está disponível no EAP (Early Access Program) e estará no PhpStorm 8.

Você pode obter o PhpStorm 8 EAP aqui.

Conclusão

Configuramos o PhpStorm para usar o Xdebug e o PHPUnit em um servidor remoto, sendo uma máquina virtual ou física, usando os arquivos do projeto que estão em sua máquina de maneira remota. Com a configuração que fizemos podemos ir além e usar outras ferramentas de garantia de qualidade remotamente também, bem como profiling e cobertura de testes.

Quer desenvolver ainda melhor ou tem alguma dúvida? Pergunte aqui nos comentários – sua interação pode virar um artigo aqui.

Develop with pleasure!
– JetBrains PhpStorm Team

image description

Discover more