Zend Server – Parte 5 – Eventos e Code Tracing

Boa tarde pessoal!

Update: Existe um post atualizado com a versão 8. Pode ser encontrada neste link.

Hoje vou falar um pouco sobre dois recursos muito bons do Zend Server, Eventos e Code Tracing.

É dito que 80% do tempo gasto em solucionar um bug é apenas para localizar o bug. Até acharmos onde está a linha com problema pode demorar muito. A falta de um ponto-e-vírgula é relativamente rápido, só olhar no log do php, o problema é quando o erro acontece “de vez em quando”, dependendo de certas condições do sistema, talvez uma variável sendo passada errada por exemplo.

O Zend Server facilita em MUITO este trabalho de localizar os problemas, e não só erros, mas consumos exagerados de memória, lentidão ao abrir uma página, etc.

Então vamos ver na prática como funciona. Vamos usar nosso Zend Server e nosso projeto tutorial instalado nesta série (veja os posts anteriores).

Tentei abrir meu projeto e demorou muito, o que está gerando esta demora? Vamos analisar. Primeiro vamos abrir o Zend Server:

1

Primeiro notamos pela gráfico da pizza que, de todos os eventos no sistema, 75% são de erros e 25% de performance.

Ta tabela abaixo, ele ja me informa que o meu projeto gerou um evento “Slow Request Execution” dizendo que levou mais de 10 segundos para abrir e que também gerou alguns erros de PHP na função date. Vamos começar analisando este último.

Vamos clicar em cima da linha do erro sobre a data para vermos os detalhes:

2

 

Hmm, pare que está faltando uma configuração da timezone do PHP. Este é rápido de ajustar e nem precisamos acessar servidor, editar php.ini, nada. Faremos pelo próprio Zend Server.

Primeiro vamos na aba “Configurations” -> “PHP” e clicamos na linha do “date”:

3

 

Podemos ver que o campo “timezone” realmente está em branco. Basta digitarmos nele “America/Sao_Paulo” e clicarmos no botão “Save” acima. Depois da alteração, basta reiniciar o Zend Server e pronto.

Vamos tentar abrir novamente o projeto e ver se o erro sobre a data parou:

4

 

Bom. Atualizei a tela e gerou apenas mais 1 evento, o da lentidão na resposta. Novamente vamos clicar em cima dele para vermos os detalhes:

5

 

E clicar em “More details” para vermos os detalhes:

6

 

Nesta tela podemos ver todas as variáveis do $_SERVER, as do request e detalhes da rota. Infelizmente a versão gratuita não possui o recurso de “Code Tracing” que nos permite ir linha a linha no caminho da requisição, o que nos obrigaria a procurar o motivo da demora do jeito “tradicional”. Mas vou mostrar como o recurso funciona, pois possuo a licença Developer. Ao clicar na pequena engrenagem à esquerda, vamos para a tela do Code Tracing:7

 

E verificamos que a função “indexAction” do Application\Controller\IndexController está levando, sozinha, 10 segundos. Vamos ver o que ela faz:

public function indexAction()
{
    sleep(10);
    return new ViewModel();
}

Parece que achamos nosso problema de lentidão 🙂

Dependendo da licença do Zend Server, pode-se mandar alerta por email também, caso uma regra de monitoramento aconteça. Já existem várias regras por padrão:

9

 

E cada uma com níveis de alerta e cada nível com suas configurações. Por exemplo, podemos mandar email caso uma página leve mais de 5 segundos, mas se levar 4 o servidor irá apenas registrar o evento:

10

 

Ele permite também criarmos nossas próprias regras, inclusive na versão gratuita (apesar de alguns recursos estarem bloqueados).

Realmente facilita e acelera em MUITO a procura de erros, já mostra qual a função com problema, qual linha, quais parâmetros foram passados para a função, quais os retornos das funções, o caminho inteiro, etc. Uma ferramenta muito boa.

Referências:

Parte 1 – Visão Geral

Parte 2 – Instalação e Configuração

Parte 3 – Distribuição (Deployment)

Parte 3.5 – Definir uma aplicação

Parte 4 – Métrica

Parte 5 – Eventos e Code Tracing

 

 

Até a próxima!

Leandro Silva

Parar propagação de evento no jQuery

Bom dia pessoal!

Aí vai uma dica rápida mas que pode ser uma dor de cabeça para muita gente.

Suponha que você fez uma tabela e cada linha ao ser clicada executa uma ação, por exemplo vai para uma tela de edição. Mas na mesma linha você colocou um botão para remover que ao ser clicado vai para outra. Exemplo:

<table id="lista" class="table table-hover table-bordered">
<thead>
    <tr>
        <th>Login</th>
        <th>Nome</th>
        <th></th>
    </tr>
</thead>
<tbody>
    <tr class="linha">
        <td>leandro</td>
        <td>Leandro</td>
        <td><button class="btn-remover" data-usuario="1"><i class="icon-trash"></i></button></td>
    </tr>
</tbody>
</table>

<script>
$(document).ready(function(){
    $('.linha').on('click',function(){
        alert('editar');
    });
    $('.btn-remover').on('click',function(){
        alert('remover');
    });
</script>

Mas quando você clica no botão remover, aparece remover, mas logo em seguida também aparece o editar. Pior, quando o click apenas redireciona para outra página, você vê apenas indo para a tela de edição.

Isso porque o evento “click” é propagado para todos os objetos clicados, mesmo que um esteja sobre o outro.

Solução: stopPropagation. Basta acrescentar esta linha no primeiro objeto, no nosso caso no botão remover (Não esqueça de usar o argumento “e” na definição da função):

$('.btn-remover').on('click',function(e){
    e.stopPropagation();
    alert('remover');
});

Referência:

http://api.jquery.com/event.stopPropagation/

Até a próxima!