Depurando aplicações PHP com XDebug e PHPEclipse

Muitos programadores, mesmo os mais experientes, cultivam o costume de depurar suas aplicações utilizando funções internas do PHP para parar a execução do script e exibir os dados de uma ou mais variáveis. Contudo, essa não é (como você mesmo já deve ter percebido) uma abordagem muito eficaz para se achar e corrigir problemas no seu código. Além disso, ficar enchendo seu script com die() e var_dump() não é lá uma coisa muito produtiva, seja para depuração ou apenas para entender o funcionamento de algum trecho do seu programa.

Constantemente quem vem de outras linguagens para o PHP me pergunta se há uma forma mais eficiente para depuração no PHP. Algumas vezes até programadores experientes na linguagem me fazem esse tipo de pergunta. Sempre indico as mesmas ferramentas, mas normalmente não se encontra muita leitura explicando o funcionamento e o processo de instalação dessas ferramentas. Nos próximos parágrafos vou falar das ferramentas que utilizo para depuração e explicar como instalá-las e utilizá-las.

XDebug

XDebug é uma extensão do PHP que, entre outras coisas, adiciona dois recursos muito úteis: debug e profiling de código. Essa é uma extensão livre, ao contrário de algumas soluções como o Zend Debuger e outras proprietárias. Por isso a minha preferência por ela.

A instalação do XDebug é relativamente fácil. Qualquer um que já instalou alguma extensão no PHP não vai sentir nenhuma dificuldade nesse processo.

PHPEclipse

O PHPEclipse é um plugin do Eclipse que adiciona a ele a capacidade de edição de códigos PHP com recursos interessantes (e, pra mim hoje, indispensáveis) como auto-complete, coloração de sintaxe, auto-formatação de código, edição de arquivos .tpl (smarty), entre outras coisas. Além disso, por estar sobre o Eclipse, você pode instalar outros plugins e facilitar ainda mais o seu dia-a-dia.

Agora o motivo desse post é um dos recursos de que mais gosto no PHPEclipse, que é o suporte a depuração remota utilizando o XDebug (ele também suporta outras ferramentas de depuração). Por tudo isso, sem dúvida alguma o PHPEclipse é uma IDE para a qual vale a pena você dar uma chance.

Instalando o XDebug

Para começarmos, vamos instalar o XDebug. Parto do princípio de que você já tenha instalado o PHP com o Apache.

Instalando no Linux

Vamos começar com a instalação via gerenciadores de pacotes. Se você utiliza uma distro debian-like:

$ sudo aptitude install php5-xdebug

Ou:

$ sudo apt-get install php5-xdebug

Se você usa outra distro, procure na documentação dela como instalar pacotes pelo gerenciador de pacotes utilizado por ela.

Se você preferir, pode instalar o Xdebug via PECL (para isso, normalmente, você precisará do pacote php-dev):

$ sudo pecl install xdebug

Feito isso você precisará configurar o PHP para conseguir achar a extensão. Edite seu arquivo php.ini e adicione o seguinte:

zend_extension="/caminho/de/instalacao/do/xdebug/xdebug.so"

Após a instalação reinicie o Apache e crie um arquivo .php no seu DocumentRoot com o seguinte:

<?php
phpinfo();

A confirmação da instalação do XDebug está no print-screen abaixo:
Confirmação da instalação do XDebug

Instalando no Windows

É fato que não gosto do MS Windows nem pintado de ouro, mas como muitos o utilizam para o desenvolvimento dos seus sistemas (pobres sofredores) não posso deixar de explicar a instalação nesse SO. Por sorte no windows é quase tão fácil quanto no linux:

Baixe a DLL do XDebug no site [www.XDebug.org] e copie na pasta de extensões do PHP ($PASTA_DO_PHP/ext). Abra o arquivo de configuração do PHP (php.ini) e adicione:

[XDebug]
zend_extension_ts=php_xdebug.dll

Reinicie o Apache e crie um arquivo .php no seu DocumentRoot com o seguinte:

<?php
phpinfo();

A confirmação da instalação do XDebug está no print-screen abaixo:
Confirmação da instalação do XDebug

Configurando o XDebug para Depuração Remota

Para utilizar o XDebug é necessário fazer algumas configurações. Se você instalou no linux via gerenciador de pacotes provavelmente essas configurações já existam. De qualquer forma, é bom dar uma revisada.

Se você utiliza Windows ou compilou o PHP manualmente no Linux, abra o arquivo php.ini. Se você instalou via pacote, provavelmente você terá uma pasta conf.d no mesmo diretório do arquivo php.ini e, dentro desse diretório, um arquivo xdebug.ini. É nele que você deverá fazer as alterações. Adicione as seguintes linhas no seu arquivo:

; permite que a depuração seja habilitada via browserxdebug.remote_enable=On
; host onde rodará o cliente xdebug (phpeclipse)
xdebug.remote_host=localhost
; porta utilizada pelo cliente xdebug. Pode ser qualquer porta,
; mas na hora de configurar o cliente você deve utilizar mesma porta que utilizar aqui
xdebug.remote_port=9000
; identificador do cliente xdebug
xdebug.idekey="default"
xdebug.remote_handler=dbgp
xdebug.remote_mode=req

Salve o arquivo e reinicie o Apache.

Instalando o Eclipse com PHPEclipse

Baixe o Eclipse no site http://www.eclipse.org. Atualmente o Eclipse está na versão 3.4 (Ganymede).

O link direto para o download dessa versão para Linux é http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.4.2-200902111700/eclipse-SDK-3.4.2-linux-gtk.tar.gz Para o Windows é http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.4.2-200902111700/eclipse-SDK-3.4.2-win32.zip .

Caso prefira, entre no link http://www.eclipse.org/downloads/packages/ e procure a versão para a sua plataforma.

Baixe e instale o Eclipse na sua plataforma. Feito isso, abra o eclipse e siga os passos abaixo:

  1. Clique em Help > Software Updates > Find and Install
  2. Marque a opção “Search for new features to install”
  3. Clique no botão “New Remote Site”
  4. Dê um nome para o site de atualização e coloque no campo URL o seguinte endereço: http://phpeclipse.sourceforge.net/update/stable/1.2.x/
  5. Clique em “OK”
  6. Certifique-se de que o novo site de Atualização está marcado e clique em “Finish”
  7. Será apresentada uma lista de “Features” instaláveis. Selecione a que tem escrito “PHPEclipse”
  8. Clique em “Next” e selecione a opção “I accept the terms in the license agreement” e clique em “Next” novamente.
  9. Clique em “Finish”

Após isso o PHPEclipse estará instalado.

Configurando o perfil de Debug no PHPEclipse

Abra o Eclipse. Será apresentada uma tela de boas vindas. Feche-a e crie um novo projeto PHP:

  1. File > New > Other
  2. PHP > PHP Project
  3. Escolha um nome para o projeto e o local onde seus arquivos serão salvos
  4. clique em Finish

Crie um novo arquivo no seu projeto:

  1. File > New > Other
  2. PHP > PHP File

Adicione o seguinte conteúdo no seu novo arquivo:

if (isset($_GET['total'])) {$i = $_GET['total'];} else {
    $i = 100;
}
$ascii_chars = array();
for ($n = 0; $n &lt;= $i; $n++) {
    $ascii_chars[$n] = chr($n);
}
$keys = array_keys($ascii_chars);

$table = '&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;';
$table .= implode('&lt;/th&gt;&lt;td&gt;%s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;', $keys);
$table .= '&lt;/th&gt;&lt;td&gt;%s&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;';

$args = array_merge(array($table), $ascii_chars);

$table = call_user_func_array('sprintf', $args);
echo $table;

Agora vamos criar um perfil de Depuração no Eclipse para podermos depurar nosso arquivo:

  1. Clique no menu Run > Open Debug Dialog
  2. Clique em PHP XDebug Remote Script duas vezes
  3. Dê um nome para o perfil no campo Name
  4. Na aba Main:
    1. Escola o Projeto no campo Projet
    2. No campo Ide Identification String coloque a mesma string utilizada na configuração do xdebug (xdebug.idekey)

A Primeira aba deve ter ficado assim:

XDebug Main

  1. Na aba Pathmap:
    1. Clique em New
    2. Escolha a pasta onde está seu projeto no campo Local_Path
    3. Como estamos trabalhando localmente, copie o mesmo valor do campo Local_Path para o campo Remote Path

No meu Eclipse ficou assim:

xdebug pathmap

Após clicar em Debug o Eclipse deve mostrar uma tela assim:

xdebug debugging

Se sua tela não estiver assim, o Eclipse não abriu automaticamente a perspectiva de Depuração e teremos de abrí-la manualmente:

  1. Clique no menu Window > Open Perspective > Debug

No editor de códigos, clique duas vezes no canto esquerdo para adicionar um breakpoint. Vai aparecer um círculo azul ao lado da linha onde você marcou o breakpoint:
xdebug Breakpoint

Agora abra o browser e acesse o seu arquivo. Note que não acontecerá nada no Eclipse e nada de diferente no browser. Agora adicione a seguinte string ao final da URL no browser:

?XDEBUG_SESSION_START=default

Note que utilizei default pois foi esse o identificador que utilizei para o PHPEclipse (Ide Identification String) e para o XDebug(xdebug.idekey). A requisição ficará rodando sem mostrar nada na tela. Volte ao Eclipse e veja que a execução do Script parou no ponto onde você marcou o Breakpoint:
xdebug Breakpoint 2

Veja também que agora a View Variables está mostrando todas as variáveis do seu script e os valores (se já há algum) de cada uma. Para dar seqüência à execução do script, clique no botão Resume (parece um botão de play) na aba Debug. Nessa aba há ainda outros quatro botões interessantes:

  1. Stop – Pára a execução do script e envia a saída para o browser
  2. Step Into – Vai ao próximo ponto de execução do script. Se for uma função entra nela.
  3. Step Over – Vai ao próximo ponto de execução do script. Se for uma função pula para o próximo ponto logo após a chamada da função.
  4. Step Return – Pula para o ponto de execução logo após o ponto em que a função foi chamada.

Não hesite em criar vários testes para entender bem o funcionamento de cada um dos botões da View Debug. No site do PHPEclipse e XDebug você também irá encontrar mais informações.

Mas e se você estiver fazendo uma requisição do tipo POST? A não ser que modifique seu script você perderá a variável XDEBUG_SESSION_START necessária para a inicialização da depuração. Pois temos uma solução para esse problema também:

Instalando e configurando o XDebug Helper

Existe uma extensão do Firefox que ajuda a inicializar a Depuração remota do XDebug, a XDebug Helper. Você pode instalá-la pelo endereço [https://addons.mozilla.org/pt-BR/firefox/addon/3960].

Após a instalação reinicie o Firefox e siga os passos abaixo:

  1. Clique no Menu Tools > Add-ons
  2. Clique no botão Preferences do Add-on XDebug Helper
  3. No campo xdebug.idekey digite a string de IDE que você utiliza no Eclipse e no XDebug.

Para iniciar uma sessão de depuração, clique no botão com um X, no canto inferior direito:

xdebug helper

Pronto, agora atualize a página e a sessão de depuração irá ser iniciada no Eclipse. Agora seu ambiente de desenvolvimento com Depuração Profissional está pronto e funcionando a todo o vapor.

Agora que você irá poupar bastante tempo na hora de depurar suas aplicações, poderá utilizar esse tempo livre para estudar um pouco mais as duas ferramentas e até explorar um outro recurso do XDebug: o Profile. Em breve eu escrevo sobre a utilizaçao desse recurso, mas já adianto alguns programas para que você possa ir se divertindo: Wingrind e Kcachegrind.

Comments

comments powered by Disqus