Zend_Db_Profiler Introdução Zend_Db_Profiler pode ser habilitado para permitir o profilling(análise de desempenho) de suas consultas(instruções SQL). Neste profiler(analisador) incluem-se as consultas processadas pelo adaptador e o tempo gasto em suas execuções, permitindo inspecionar as consultas que foram executadas, sem a necessidade de adicionar código ou classes extras de depuração. O seu uso avançado permite também que o desenvolvedor filtre quais consultas serão analisadas. Habilite o profiler para todos as consultas passando uma directiva para o construtor do adaptador, ou solicitando ao adaptador para habilitá-lo depois. '127.0.0.1', 'username' => 'malory', 'password' => '******', 'dbname' => 'camelot', 'profiler' => true // ligando o profiller; mude para false para desabilitá-lo(padrão) ); $db = Zend_Db::factory('PDO_MYSQL', $params); // desligando o profiller: $db->getProfiler()->setEnabled(false); // ligando o profiller: $db->getProfiler()->setEnabled(true);]]> Usando o Profiler A qualquer momento, capture o profiler usando o método getProfiler() do adaptador. getProfiler();]]> Com isto, é retornado uma instância do objeto Zend_Db_Profiler. Com esta instância, o desenvolvedor pode examinar suas consultas usando uma variedade de métodos: getTotalNumQueries() retorna o número total de consultas que foram analisadas. getTotalElapsedSecs() retorna o número total de segundos gastos em todas as consultas analisadas. getQueryProfiles() retorna um array com todas as análises das consultas. getLastQueryProfile retorna a última (mais recente) consulta analisada, independente ou não se esta consulta foi finalizada(se não, o tempo final será nulo) clear() limpa qualquer análise antiga da pilha de execução. O valor retornado pelo getLastQueryProfile() e os elementos individuais do getQueryProfiles() são objetos do Zend_Db_Profiler_Query, que provê a habilidade de inspecionar suas consultas individualmente: getQuery() retorna o texto SQL da consulta. O texto SQL de uma instrução preparada (prepared statement) com seus parâmetros é o texto no momento em que a consulta foi preparada, contendo apenas os seus parâmetros, e não os seus valores usados quando a instrução é executada. getQueryParams() retorna um array de valores dos parâmetros que são usados quando for executada uma query preparada. Nisto incluem-se ambos parâmetros e argumentos acoplados do método execute() da instrução. As chaves do array são os posicionais (1-baseado) ou nomeados(string) índices de parâmetro. getElapsedSecs() retorna o número de segundos que a consulta executou. A informação fornecida pelo Zend_Db_Profiler é útil para analisar os gargalos das aplicações, e para depurar consultas que foram executadas. Por exemplo, para ver a última consulta que foi executada: getLastQueryProfile(); echo $query->getQuery();]]> Talvez uma página qualquer esteja gerando lentidão. Use o profiler para determinar primeiro o total de segundos gastos em todas as consultas, e então examine-as para encontrar aquele que demorou mais tempo para executar. getTotalElapsedSecs(); $queryCount = $profiler->getTotalNumQueries(); $longestTime = 0; $longestQuery = null; foreach ($profiler->getQueryProfiles() as $query) { if ($query->getElapsedSecs() > $longestTime) { $longestTime = $query->getElapsedSecs(); $longestQuery = $query->getQuery(); } } echo 'Executado: ' . $queryCount . ' consultas em ' . $totalTime . ' seconds' . "\n"; echo 'Tamanho médio da query' . $totalTime / $queryCount . ' seconds' . "\n"; echo 'consultas por segundo: ' . $queryCount / $totalTime . "\n"; echo 'Query que demorou mais tempo: ' . $longestTime . "\n"; echo "Query mais longa: \n" . $longestQuery . "\n";]]> Uso Avançado do Profiller Além da inspeção de consultas, o profiler também permite ao devenvolvedor filtrar quais consultas sejam analisadas. Os seguintes métodos operam em uma instância de Zend_Db_Profiler. Filtro por tempo decorrido das consultas setFilterElapsedSecs() permite ao desenvolvedor setar um tempo mínimo para uma consulta antes de ela ser analisada. Para remover o filtro, passe para o método um valor nulo. setFilterElapsedSecs(5); // Todas as consultas analisadas, não importando o tamanho: $profiler->setFilterElapsedSecs(null);]]> Filtro pelo tipo de consulta setFilterQueryType() permite ao desenvolvedor setar quais tipos de consultas deverão ser analisadas; para analisar múltiplos tipos, lógicos ou todas. Os tipos de consultas são definidas segundo as constantes de Zend_Db_Profiler Zend_Db_Profiler::CONNECT: operações de conexão, ou seleção de base de dados. Zend_Db_Profiler::QUERY: consultas gerais da base de dados que não se encaixam com outro tipos. Zend_Db_Profiler::INSERT: qualquer consulta que adicionar novos dados para a base de dados, geralmente um INSERT SQL. Zend_Db_Profiler::UPDATE: qualquer consulta que atualiza dados existentes, geralmente um UPDATE SQL. Zend_Db_Profiler::DELETE: qualquer consulta que exclui dados existentes, geralmente um DELETE SQL. Zend_Db_Profiler::SELECT: qualquer consulta que retorna dados existentes, geralmente um SELECT SQL. Zend_Db_Profiler::TRANSACTION: qualquer operação transacional, como a inicialição da transação, commit ou rollback. Assim como usando o setFilterElapsedSecs(), você pode remover quaisquer filtros existentes passando null como único argumento. setFilterQueryType(Zend_Db_Profiler::SELECT); // Analisa as consultas SELECT, INSERT e UPDATE $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE); // Analisa a instrução DELETE (então podemos descobrir porque os dados continuam desaparecendo) $profiler->setFilterQueryType(Zend_Db_Profiler::DELETE); // Remove totos os filtros $profiler->setFilterQueryType(null);]]> Retorna análises por tipo de consulta Usando o setFilterQueryType(), podemos resumir as análises geradas. Entretanto, às vezes é mais útil manter todas as análises e visualizar somente aquelas que você precisa num determinado momento. Outra funcionalidade do getQueryProfiles() é a capacidade de fazer esta filtragem "on-the-fly" (execução de código em tempo de execução), passando o tipo da consulta(ou uma combinação lógica de tipos) em seu primeiro argumento; veja na uma lista de todas as constantes dos tipos de consultas. getQueryProfiles(Zend_Db_Profiler::SELECT); // Retorna apenas anásiles de consultas SELECT, INSERT e UPDATE. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE); // Retorna as análises feitas na instrução DELETE (então podemos descobrir porque os dados continuam desaparecendo) $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);]]>