Depurando aplicações PHP like a BOSS
Thiago Rodrigues
Eng. de Software Sr.
CI&T - PHPSP
Thiago Rodrigues
Bacharel em Sistemas de Informação pela
Universidade do Estado de Minas Gerais (UEMG);
Engenheiro de Software Sênior na CI&T
Programador PHP há 11 anos;
Evangelista PHPSP e co-organizador do PHPSP
Campinas
Entusiasta do software livre
Gammer
Depuração - O que é?
Definição formal:
Depuração (em inglês: debugging, debug) é o processo de encontrar e
reduzir defeitos num aplicativo de software ou mesmo em hardware. [..]
https://pt.wikipedia.org/wiki/Depuração
● diariamente despendemos esforço considerável
● é um processo analítico
● é um processo repetitivo
● é incremental (dividir para conquistar)
● pode haver muita pressão envolvida
Depuração - Habilidade necessária
O bom desenvolvedor é capaz de depurar e resolver
problemas com:
● tranquilidade
● efetividade
● produtividade
● clareza
● assertividade
Depuração - domínio de ferramentas
Para executar bem qualquer
trabalho é fundamental dominar
ferramentas que auxiliam na
execução do mesmo.
A habilidade de criar e usar
ferramentas foi e ainda é
fundamental para espécie humana.
Quais ferramentas vocês usam para depurar
aplicações PHP?
Ferramentas de depuração - Não existe bala de prata
Diferentes problemas demandam ferramentas
diferentes.
É fundamental conhecer diversas ferramentas,
entender quando usar e como usar.
Bê-a-bá da depuração de aplicações PHP
<?php echo 'Hello world!';
Bê-a-bá da depuração de aplicações PHP
<?php
$vetor = array(
'frutas' => array(
'banana', 'maça', 'laranja'
),
'vegetais' => array(
'alface', 'rúcula', 'couve'
),
);
echo $vetor;
Bê-a-bá da depuração de aplicações PHP
<?php
$vetor = array(
'frutas' => array(
'banana', 'maça', 'laranja'
),
'vegetais' => array(
'alface', 'rúcula', 'couve'
),
);
print_r($vetor);
Bê-a-bá da depuração de aplicações PHP
<?php
$vetor = array(
'frutas' => array(
'banana', 'maça', 'laranja'
),
'vegetais' => array(
'alface', 'rúcula', 'couve'
),
);
echo '<pre>';
print_r($vetor);
Bê-a-bá da depuração de aplicações PHP
<?php
$vetor = array(
'',
NULL,
'laranja',
123,
'123',
1.0,
'1.0',
);
echo '<pre>';
print_r($vetor);
Bê-a-bá da depuração de aplicações PHP
<?php
$vetor = array(
'',
NULL,
'laranja',
123,
'123',
1.0,
'1.0',
);
echo '<pre>';
var_dump($vetor);
Bê-a-bá da depuração de aplicações PHP
<?php
$vetor = array(
// elementos
);
ob_start();
echo '<pre>';
var_dump($vetor);
$info = ob_get_clean();
file_put_contents('/tmp/debug.html',
$info);
echo 'Oi ;)';
Problemas comuns da abordagem "imprimir na tela"
● Esforço repetitivo
● Não exibe todo o contexto de variáveis
● Dificulta o entendimento de estruturas de dados complexas
● Requer a quebra de funcionalidade para testes em produção
○ Você pode se dar a esse luxo? O que os usuários vão pensar?
● Desperdiça-se muito tempo tentando identificar fluxos complexos imprimindo
valores seguido da função exit() ou die().
● De vez em quando algum desses echo/print_r/var_dump são esquecidos,
acarretando na quebra de funcionalidades ou do layout.
● Identificação de problemas de performance é extremamente onerosa
Ensino fundamental da depuração de aplicações PHP
Ajustar php.ini para exibir qualquer tipo de erro:
error_reporting = E_ALL
display_errors = On # Desligar em PROD.
Verificar logs do servidor web enquanto as requisições estão
ocorrendo (stream):
sudo tail -f /var/log/apache2/error.log [outro/file]
Tipos de depuração
Debugging
Conecta-se ao software e controla o fluxo de execução da
aplicação e obtém seu estado.
Tracing
Imprime informações em momentos chaves, tais como a pilha de
execução da aplicação.
Profiling
Coleta e mensura diversos dados estatísticos da aplicação, tais como
tempo de execução, memória utilizada, quantidades de chamadas, etc.
Xdebug
A mais poderosa ferramenta de depuração PHP.
Principais funcionalidades:
● Debugging
● Tracing
● Profiling
● Proteção contra loop infinito
● Deixa o var_dump bonito
Xdebug - Instalação
No Linux:
sudo apt-get install php5-xdebug
No Mac (usando brew):
sudo brew install php56-xdebug
Xdebug - Tracing
Xdebug - "embeleza" o var_dump
Xdebug - Configurando depuração remota
No servidor web - xdebug.ini:
xdebug.remote_connect_back=1
xdebug.remote_enable=1
Túnel SSH (necessário somente para aplicações remotas)
ssh -R 9000:localhost:9000 thiago@site.com
Xdebug - Configurando depuração remota no PHPStorm
1) Abra a janela Preferences e navegue até PHP > Servers.
2) Preencha o Name, Host e Porta do servidor PHP.
3) Se for um servidor remoto, habilite "Use path mappings" e mapeie a
raiz do projeto local com o caminho absoluto do projeto no servidor remoto.
4) Clique em OK para salvar e fechar a janela.
Xdebug - Configurando depuração remota no PHPStorm
1) Vá até o menu Run e clique em Edit Configurations.
2) Clique no botão + e depois em PHP Web Application.
3) Preencha o campo Name; no campo Server selecione o servidor
criado no slide anterior e coloque / em Start URL.
4) Clique em OK para salvar e fechar a janela.
Xdebug - Iniciando a depuração no PHPStorm
Se a depuração for remota, criar o túnel SSH antes.
1) Vá até o menu Run e clique em Debug 'nome'.
2) Será aberto uma janela do navegador.
Xdebug - Tela de depuração no PHPStorm
Xdebug - Depuração no PHPStorm
clique na imagem p/abrir o
vídeo no YouTube
Xdebug - Configurando profiling
xdebug.ini
xdebug.profiler_enable_trigger=1
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/var/www/phpsp"
Visite o site, note que ele criará alguns arquivos cachegrind.out na pasta
especificada.
No PHPStorm:
Acesse Tools > Analyze Xdebug Profiler Snapshot e selecione algum
arquivo cachegrind.out.
Xdebug - Analisando profiling no PHPStorm
clique na imagem p/abrir o
vídeo no YouTube
Xdebug - Analisando profiling no KCachegrind
XHProf
Ferramenta para profiling.
XHProf - Gráfico de chamadas
Drupal 8 - Webprofiler
Blackfire - outra ferramenta de profiling
Conclusão
● Precisa checar uma estrutura de dados básica? var_dump
● Precisa investigar o fluxo de execução? Xdebug
● Precisa investigar uma estrutura de dados complexa? Xdebug
● Precisa melhorar a performance de uma página? Utilize uma ferramenta
de profiling antes de sair atirando para todo lado.
Invista seu tempo em ferramentas de depuração para ganhar
produtividade.
Contato
xthiago@gmail.com
xthiago.com
+ PHP dia 20/agosto em Campinas:
phpspima.com.br

Depurando aplicações PHP like a BOSS

  • 1.
    Depurando aplicações PHPlike a BOSS Thiago Rodrigues Eng. de Software Sr. CI&T - PHPSP
  • 2.
    Thiago Rodrigues Bacharel emSistemas de Informação pela Universidade do Estado de Minas Gerais (UEMG); Engenheiro de Software Sênior na CI&T Programador PHP há 11 anos; Evangelista PHPSP e co-organizador do PHPSP Campinas Entusiasta do software livre Gammer
  • 3.
    Depuração - Oque é? Definição formal: Depuração (em inglês: debugging, debug) é o processo de encontrar e reduzir defeitos num aplicativo de software ou mesmo em hardware. [..] https://pt.wikipedia.org/wiki/Depuração ● diariamente despendemos esforço considerável ● é um processo analítico ● é um processo repetitivo ● é incremental (dividir para conquistar) ● pode haver muita pressão envolvida
  • 4.
    Depuração - Habilidadenecessária O bom desenvolvedor é capaz de depurar e resolver problemas com: ● tranquilidade ● efetividade ● produtividade ● clareza ● assertividade
  • 5.
    Depuração - domíniode ferramentas Para executar bem qualquer trabalho é fundamental dominar ferramentas que auxiliam na execução do mesmo. A habilidade de criar e usar ferramentas foi e ainda é fundamental para espécie humana.
  • 6.
    Quais ferramentas vocêsusam para depurar aplicações PHP?
  • 7.
    Ferramentas de depuração- Não existe bala de prata Diferentes problemas demandam ferramentas diferentes. É fundamental conhecer diversas ferramentas, entender quando usar e como usar.
  • 8.
    Bê-a-bá da depuraçãode aplicações PHP <?php echo 'Hello world!';
  • 9.
    Bê-a-bá da depuraçãode aplicações PHP <?php $vetor = array( 'frutas' => array( 'banana', 'maça', 'laranja' ), 'vegetais' => array( 'alface', 'rúcula', 'couve' ), ); echo $vetor;
  • 10.
    Bê-a-bá da depuraçãode aplicações PHP <?php $vetor = array( 'frutas' => array( 'banana', 'maça', 'laranja' ), 'vegetais' => array( 'alface', 'rúcula', 'couve' ), ); print_r($vetor);
  • 11.
    Bê-a-bá da depuraçãode aplicações PHP <?php $vetor = array( 'frutas' => array( 'banana', 'maça', 'laranja' ), 'vegetais' => array( 'alface', 'rúcula', 'couve' ), ); echo '<pre>'; print_r($vetor);
  • 12.
    Bê-a-bá da depuraçãode aplicações PHP <?php $vetor = array( '', NULL, 'laranja', 123, '123', 1.0, '1.0', ); echo '<pre>'; print_r($vetor);
  • 13.
    Bê-a-bá da depuraçãode aplicações PHP <?php $vetor = array( '', NULL, 'laranja', 123, '123', 1.0, '1.0', ); echo '<pre>'; var_dump($vetor);
  • 14.
    Bê-a-bá da depuraçãode aplicações PHP <?php $vetor = array( // elementos ); ob_start(); echo '<pre>'; var_dump($vetor); $info = ob_get_clean(); file_put_contents('/tmp/debug.html', $info); echo 'Oi ;)';
  • 15.
    Problemas comuns daabordagem "imprimir na tela" ● Esforço repetitivo ● Não exibe todo o contexto de variáveis ● Dificulta o entendimento de estruturas de dados complexas ● Requer a quebra de funcionalidade para testes em produção ○ Você pode se dar a esse luxo? O que os usuários vão pensar? ● Desperdiça-se muito tempo tentando identificar fluxos complexos imprimindo valores seguido da função exit() ou die(). ● De vez em quando algum desses echo/print_r/var_dump são esquecidos, acarretando na quebra de funcionalidades ou do layout. ● Identificação de problemas de performance é extremamente onerosa
  • 16.
    Ensino fundamental dadepuração de aplicações PHP Ajustar php.ini para exibir qualquer tipo de erro: error_reporting = E_ALL display_errors = On # Desligar em PROD. Verificar logs do servidor web enquanto as requisições estão ocorrendo (stream): sudo tail -f /var/log/apache2/error.log [outro/file]
  • 17.
    Tipos de depuração Debugging Conecta-seao software e controla o fluxo de execução da aplicação e obtém seu estado. Tracing Imprime informações em momentos chaves, tais como a pilha de execução da aplicação. Profiling Coleta e mensura diversos dados estatísticos da aplicação, tais como tempo de execução, memória utilizada, quantidades de chamadas, etc.
  • 18.
    Xdebug A mais poderosaferramenta de depuração PHP. Principais funcionalidades: ● Debugging ● Tracing ● Profiling ● Proteção contra loop infinito ● Deixa o var_dump bonito
  • 19.
    Xdebug - Instalação NoLinux: sudo apt-get install php5-xdebug No Mac (usando brew): sudo brew install php56-xdebug
  • 20.
  • 21.
  • 22.
    Xdebug - Configurandodepuração remota No servidor web - xdebug.ini: xdebug.remote_connect_back=1 xdebug.remote_enable=1 Túnel SSH (necessário somente para aplicações remotas) ssh -R 9000:localhost:9000 thiago@site.com
  • 23.
    Xdebug - Configurandodepuração remota no PHPStorm 1) Abra a janela Preferences e navegue até PHP > Servers. 2) Preencha o Name, Host e Porta do servidor PHP. 3) Se for um servidor remoto, habilite "Use path mappings" e mapeie a raiz do projeto local com o caminho absoluto do projeto no servidor remoto. 4) Clique em OK para salvar e fechar a janela.
  • 24.
    Xdebug - Configurandodepuração remota no PHPStorm 1) Vá até o menu Run e clique em Edit Configurations. 2) Clique no botão + e depois em PHP Web Application. 3) Preencha o campo Name; no campo Server selecione o servidor criado no slide anterior e coloque / em Start URL. 4) Clique em OK para salvar e fechar a janela.
  • 25.
    Xdebug - Iniciandoa depuração no PHPStorm Se a depuração for remota, criar o túnel SSH antes. 1) Vá até o menu Run e clique em Debug 'nome'. 2) Será aberto uma janela do navegador.
  • 26.
    Xdebug - Telade depuração no PHPStorm
  • 27.
    Xdebug - Depuraçãono PHPStorm clique na imagem p/abrir o vídeo no YouTube
  • 28.
    Xdebug - Configurandoprofiling xdebug.ini xdebug.profiler_enable_trigger=1 xdebug.profiler_enable=1 xdebug.profiler_output_dir="/var/www/phpsp" Visite o site, note que ele criará alguns arquivos cachegrind.out na pasta especificada. No PHPStorm: Acesse Tools > Analyze Xdebug Profiler Snapshot e selecione algum arquivo cachegrind.out.
  • 29.
    Xdebug - Analisandoprofiling no PHPStorm clique na imagem p/abrir o vídeo no YouTube
  • 30.
    Xdebug - Analisandoprofiling no KCachegrind
  • 31.
  • 32.
    XHProf - Gráficode chamadas
  • 33.
    Drupal 8 -Webprofiler
  • 34.
    Blackfire - outraferramenta de profiling
  • 35.
    Conclusão ● Precisa checaruma estrutura de dados básica? var_dump ● Precisa investigar o fluxo de execução? Xdebug ● Precisa investigar uma estrutura de dados complexa? Xdebug ● Precisa melhorar a performance de uma página? Utilize uma ferramenta de profiling antes de sair atirando para todo lado. Invista seu tempo em ferramentas de depuração para ganhar produtividade.
  • 36.
    Contato xthiago@gmail.com xthiago.com + PHP dia20/agosto em Campinas: phpspima.com.br

Notas do Editor

  • #3 Me apresentar
  • #4 (((Para quebrar um pouco o gelo))) Antes de começar a falar sobre o tema gostaria de fazer uma pesquisa aqui. 1) Quem aqui já escutou essa frase no trabalho? 2) Agora sejam sinceros, quem aqui já falou essa frase? (Se quase ninguém falar, dizer: mentirosos! haha)
  • #6 Afinal, o que é "ambiente de desenvolvimento"? Como o nome sugere, trata-se de todo o ecosistema onde desenvolvemos nossa aplicação. Tal ecosistema possui toda pilha de software necessária para rodar a aplicação que estamos desenvolvendo e geralmente fica no computador do desenvolvedor e é semelhante ao ambiente de produção, isto é, o ambiente que o usuário final usa. Além disso, geralmente instalamos ferramentas que nos auxiliam no desenvolvimento, tal como depurador, scripts que automatizam tarefas, etc.
  • #7 Eis aqui um exemplo da pilha de software requerida para ter o Drupal 8 rodando em um ambiente. (Comentar rapidamente sobre cada um dos pontos). Ao final, ressaltar: construir um ambiente de desenvolvimento não é simples, tampouco trivial.
  • #8 Problema muito comum de muitos projetos. O que tem que ser instalado? Qual versão? Qual a configuração é necessária? Será que vão lembrar 1 ano depois? E quando entrar um desenvolvedor novo? Comentar sobre quando entrei na Templum (n vou citar nome) - a cada semana, enquanto desenvolvia, me deparava com problemas que só depois descobria que faltava a instalação de um determinado módulo, a criação de um link simbólico e coisas do tipo.
  • #9 Como agir quando precisamos atualizar a versão do PHP e precisamos que todos os desenvolvedores o façam? Vamos pedir um a um? Será que todos farão? Sempre vai ter um cara que vai deixar para depois e esquecer de fazer, e como a lei de murphy prega, provavelmente vai impactar no futuro em algum bug. Além disso, como os demais membros do time podem contribuir? É fundamental que todos os membros do time conheçam toda a pilha de tecnologia.
  • #10 Quanto tempo o desenvolvedor vai levar para preparar o ambiente? É muito comum desenvolvedores ficarem construindo o ambiente por 1 ou 2 dias, assim como a necessidade da ajuda de outros membros do time. Construir o ambiente sem dúvida é um processo penoso.
  • #13 Ferramentas como o XAMMP são terríveis porque no geral são muito distoantes do ambiente onde a aplicação roda.
  • #14 A Virtualização do ambiente de desenvolvimento permite mitigar todos os problemas expostos anteriormente. Ela permite (explicar os pontos).
  • #15 Explicar a diferença arquitetural entre ambas de forma sucinta.
  • #19 TODO: colocar esse Vagrantfile e o bootstrap.sh em um gist
  • #20 TODO: colocar esse Vagrantfile e o bootstrap.sh em um gist
  • #21 TODO: colocar esse Vagrantfile e o bootstrap.sh em um gist
  • #28 TODO: colocar esse Vagrantfile e o bootstrap.sh em um gist