Subscribe to ACAlbuquerque.BlogRSS

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 deve­se 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:

erro log Qualidade de código PHP   xDebug

- 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   pode­se   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:

http://www.xdebug.org/

http://www.eltonminetto.net

http://code.google.com/p/webgrind/

http://morgamic.com/

Compartilhe :
  • Google Bookmarks
  • Twitter
  • del.icio.us
  • StumbleUpon
  • Technorati
  • Facebook
  • Live
  • Digg
  • Rec6
  • Yahoo! Bookmarks
  • Reddit
  • MySpace
  • Blogosphere News
  • email

Comentário

4 Comentários Ativos em "Qualidade de código PHP – xDebug"

  1. Alexsandro em 16/09/2009 9:15 

    Isto muito me interessa.

  2. 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!

  3. 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

  4. 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!

Comente sobre esse post...
Ah! Caso deseje um avatar, utilize o gravatar!