Qualidade de código PHP – xDebug
Em 14/09/2009 by acalbuquerque
categorizado em PHP, Tecnologia
Como o processo de desenvolvimento de software é sujeito a erros, a atividade de teste é fundamental para se obter produtos com garantia de qualidade. Portanto, é importante que você tenha antes de qualquer coisa, essa afirmação anterior como regra a ser seguida.
Fazer o debug de aplicações PHP sempre foi um grande problema. Utilizar echo e var_dump não é a melhor maneira, além de não ser nada elegante. Existe uma forma de realizar o debug de aplicações PHP de forma mais correta e útil. Esta forma é usando-se a extensão chamada xdebug.
O que é isso?
O Xdebug é uma extensão para PHP que como o próprio nome sugere, serve para auxiliar no debug de scripts PHP.
O que isso faz?
O Xdebug vai mostrar diversas informações importantes sobre o erro. O Xdebug adiciona várias opções ao php, uma delas é refazer o var_dump.
Como Instalar?
O meu ambiente de testes é o Ubuntu 9.04, porém se você é usuário Windows o mais fácil é fazer o download de um arquivo dll no site e salvá-lo no diretório ext do PHP.
Para usuários Linux, a melhor maneira é fazer a instalação usando o comando pecl:
$ sudo apt-get install php5-dev php-pear
$ sudo pecl install xdebug
No meu caso o xdebug ficou em:
/usr/lib/php5/20060613+lfs/xdebug.so
Para que o php considere o uso da extensão, o arquivo de inicialização php.ini deve ser editado
sudo gedit /etc/php5/apache2/php.ini
acrescente no fim do arquivo:
zend_extension=”/usr/lib/php5/20060613+lfs/xdebug.so”
Ou para windows: zend_extension_ts=”c:/xampp/php/ext/php_xdebug.dll”
Após isso, adicione as configurações do xdebug:
xdebug.default_enable = On
xdebug.collect_includes = On
xdebug.collect_params = On
xdebug.collect_return = On
xdebug.collect_vars = On
E agora basta reiniciar o apache:
sudo /etc/init.d/apache2 restart
- Novo var_dump
Quando a extensão está ativa, o comando var_dump mostra informações mais detalhadas das variáveis. Para testar é só executar o var_dump passando como parâmetro qualquer variável ou objeto do script. ex:
<?php $dados = array( 'um' => 'uma string', 'dois' => array( 'two.one' => array( 'two.one.zero' => 210, 'two.one.one' => array( 'two.one.one.zero' => 3.141592564, 'two.one.one.one' => 2.7, ), ), ), 'tres' => $t, 'quatro' => range(0, 5), ); var_dump( $dados ); ?>
Proteção de memória
É possível configurar o Xdebug para proteger o servidor em caso de um loop infinito, que poderia consumir muitos recursos. Por default o Xdebug configura para 100 iterações. Para modificar esta características devese adicionar a seguinte linha no php.ini e depois reinicie o apache:
xdebug.max_nesting_level=10
Assim, o programa abaixo vai invocar a função loop_infinito() somente dez vezes e depois irá gerar um erro:

- Coletando mais informações
Para que o Xdebug possa coletar mais informações sobre os erros é possível configurá-lo para capturar as variáveis globais como POST, GET, FILES, etc. Para isso é só adicionar as linhas abaixo no php.ini e depois reinicie o apache:
;; //Capturar as variáveis globais
xdebug.dump.GET=*
xdebug.dump.POST=*
xdebug.dump.COOKIE=*
xdebug.dump.ENV=*
xdebug.dump.FILES=*
xdebug.dump.REQUEST=*
xdebug.dump.SERVER=*
xdebug.dump.SESSION=*
ps: O *( lê-se coringa) pode ser substituído pelo nome da variável que se deseja capturar.
Testes
Quantas funções foram invocadas no script?
<?php echo xdebug_get_function_count(); ?>
Quanto tempo demorou a execução?
<?php
for($i=0;$i<1000000;$i++) {
$j = $i;
}
echo "Tempo de execução=". xdebug_time_index();
?>
Quanta memória utilizou?
<?php
echo "Memória: ", xdebug_memory_usage(), " bytes\n\n";
for($i=0;$i<1000000;$i++) {
$j = $i;
}
echo "Máximo de Memória usada: ", xdebug_peak_memory_usage(), " bytes\n";
?>
Trace da aplicação
Para acompanhar o fluxo da aplicação é preciso adicionar as linhas abaixo no php.ini e depois reinicie o apache:
xdebug.auto_trace=1
xdebug.trace_output_dir=/tmp
xdebug.trace_options=1
xdebug.trace_format = 0
Desta forma será criado um arquivo no /tmp chamado trace.??? para cada script PHP que for executado. Neste arquivo estará descrito cada comando executado, variáveis criadas, etc. Assim facilita a visualização do fluxo do script e eventuais erros.
Profiling
Profiling é uma maneira de visualizar quais partes do código do script estão demorando mais para executar. O Xdebug precisa ser configurado para poder gerar estas estatísticas. Para isso deve-se adicionar as linhas no php.ini e depois reinicie o apache:
xdebug.profiler_enable = 1
xdebug.extended_info = 0
xdebug.remote_enable = 0
xdebug.profiler_output_dir=/tmp
Após a execução de um script é gerado um arquivo no /tmp com as estatísticas de execução. Para analisarmos estas estatísticas podese usar uma ferramenta gráfica de cache profiling como kcachegrind(para Linux), WinCacheGrind(para windows) ou a ferramenta web Webgrind.
Enfim, existem outras funcionalidades que podem ser somadas e usadas com o xDebug, mas isso fica para um próximo post.
Referências:











Alexsandro em 16/09/2009 9:15
Isto muito me interessa.
acalbuquerque em 16/09/2009 9:40
Opa Alexandre. Que bom que te interessou.
O proximo post dará continuidade à outras ferramentas que juntas com o xdebug aumenta ainda mais a qualidade do código e produtividade. Fica atento!
Rodrigo em 10/10/2009 14:03
Ola, legal mesmo este artigo.
Tenho uma duvida relacionada ao var_dump que nao descobri o que fazer. Em minha maquina ele aparece como de deve: tabulado e colorido. Mas em outras maquinas ele aparece todo desconfigurado.
Nao entendi o porque e nao vi artigos que mostram como fazer isto.
Gostaria de saber se podeia me dar um help de onde consseguir esta informacao.
Grato
acalbuquerque em 11/10/2009 1:52
Opa! Cara, como você falou que na sua máquina ele funciona legal…peço para que você verifique a versão do teu PHP ( phpinfo() ) e se as extensões são semelhantes(mesma versão) e se estão devidamente instaladas. Pois é para ficar tabulado e colorido mesmo.
Checa isso…caso ainda tenha dificuldades, coloca ai um print do phpinfo() da máquina com problema para eu analisar. Ok?
Abraço!