Zend_Db_Profiler.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. <sect1 id="zend.db.profiler">
  2. <title>Zend_Db_Profiler</title>
  3. <sect2 id="zend.db.profiler.introduction">
  4. <title>Introdução</title>
  5. <para>
  6. <code>Zend_Db_Profiler</code> pode ser habilitado para permitir o profilling(análise de desempenho) de suas consultas(instruções SQL).
  7. Neste profiler(analisador) incluem-se as consultas processadas pelo adaptador e o tempo gasto em suas execuções,
  8. 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.
  9. </para>
  10. <para>
  11. Habilite o profiler para todos as consultas passando uma directiva
  12. para o construtor do adaptador, ou solicitando ao adaptador para
  13. habilitá-lo depois.
  14. </para>
  15. <programlisting role="php"><![CDATA[<?php
  16. require_once 'Zend/Db.php';
  17. $params = array (
  18. 'host' => '127.0.0.1',
  19. 'username' => 'malory',
  20. 'password' => '******',
  21. 'dbname' => 'camelot',
  22. 'profiler' => true // ligando o profiller; mude para false para desabilitá-lo(padrão)
  23. );
  24. $db = Zend_Db::factory('PDO_MYSQL', $params);
  25. // desligando o profiller:
  26. $db->getProfiler()->setEnabled(false);
  27. // ligando o profiller:
  28. $db->getProfiler()->setEnabled(true);]]>
  29. </programlisting>
  30. </sect2>
  31. <sect2 id="zend.db.profiler.using">
  32. <title>Usando o Profiler</title>
  33. <para>
  34. A qualquer momento, capture o profiler usando o método
  35. <code>getProfiler()</code> do adaptador.
  36. </para>
  37. <programlisting role="php"><![CDATA[<?php
  38. $profiler = $db->getProfiler();]]>
  39. </programlisting>
  40. <para>
  41. Com isto, é retornado uma instância do objeto <code>Zend_Db_Profiler</code>. Com
  42. esta instância, o desenvolvedor pode examinar suas consultas usando uma variedade de métodos:
  43. </para>
  44. <itemizedlist>
  45. <listitem>
  46. <para>
  47. <code>getTotalNumQueries()</code> retorna o número total
  48. de consultas que foram analisadas.
  49. </para>
  50. </listitem>
  51. <listitem>
  52. <para>
  53. <code>getTotalElapsedSecs()</code> retorna o número total
  54. de segundos gastos em todas as consultas analisadas.
  55. </para>
  56. </listitem>
  57. <listitem>
  58. <para>
  59. <code>getQueryProfiles()</code> retorna um array com todas as
  60. análises das consultas.
  61. </para>
  62. </listitem>
  63. <listitem>
  64. <para>
  65. <code>getLastQueryProfile</code> retorna a última (mais recente)
  66. consulta analisada, independente ou não se esta consulta foi finalizada(se não, o tempo final será nulo)
  67. </para>
  68. </listitem>
  69. <listitem>
  70. <para>
  71. <code>clear()</code> limpa qualquer análise antiga da pilha de execução.
  72. </para>
  73. </listitem>
  74. </itemizedlist>
  75. <para>
  76. O valor retornado pelo <code>getLastQueryProfile()</code> e os
  77. elementos individuais do <code>getQueryProfiles()</code> são
  78. objetos do <code>Zend_Db_Profiler_Query</code>, que provê a
  79. habilidade de inspecionar suas consultas individualmente:
  80. </para>
  81. <itemizedlist>
  82. <listitem>
  83. <para>
  84. <code>getQuery()</code> retorna o texto SQL da consulta.
  85. O texto SQL de uma instrução preparada (prepared statement) com seus parâmetros é o texto
  86. no momento em que a consulta foi preparada, contendo apenas os seus parâmetros, e não os seus valores
  87. usados quando a instrução é executada.
  88. </para>
  89. </listitem>
  90. <listitem>
  91. <para>
  92. <code>getQueryParams()</code> retorna um array de valores dos parâmetros que são usados
  93. quando for executada uma query preparada.
  94. Nisto incluem-se ambos parâmetros e argumentos acoplados do método <code>execute()</code> da instrução.
  95. As chaves do array são os posicionais (1-baseado) ou nomeados(string) índices de parâmetro.
  96. </para>
  97. </listitem>
  98. <listitem>
  99. <para>
  100. <code>getElapsedSecs()</code> retorna o número de segundos que a consulta executou.
  101. </para>
  102. </listitem>
  103. </itemizedlist>
  104. <para>
  105. A informação fornecida pelo <code>Zend_Db_Profiler</code> é útil para analisar os gargalos
  106. das aplicações, e para depurar consultas que foram executadas. Por exemplo, para ver a última
  107. consulta que foi executada:
  108. </para>
  109. <programlisting role="php"><![CDATA[<?php
  110. $query = $profiler->getLastQueryProfile();
  111. echo $query->getQuery();]]>
  112. </programlisting>
  113. <para>
  114. Talvez uma página qualquer esteja gerando lentidão. Use o profiler para determinar
  115. primeiro o total de segundos gastos em todas as consultas, e então
  116. examine-as para encontrar aquele que demorou mais tempo para executar.
  117. </para>
  118. <programlisting role="php"><![CDATA[<?php
  119. $totalTime = $profiler->getTotalElapsedSecs();
  120. $queryCount = $profiler->getTotalNumQueries();
  121. $longestTime = 0;
  122. $longestQuery = null;
  123. foreach ($profiler->getQueryProfiles() as $query) {
  124. if ($query->getElapsedSecs() > $longestTime) {
  125. $longestTime = $query->getElapsedSecs();
  126. $longestQuery = $query->getQuery();
  127. }
  128. }
  129. echo 'Executado: ' . $queryCount . ' consultas em ' . $totalTime . ' seconds' . "\n";
  130. echo 'Tamanho médio da query' . $totalTime / $queryCount . ' seconds' . "\n";
  131. echo 'consultas por segundo: ' . $queryCount / $totalTime . "\n";
  132. echo 'Query que demorou mais tempo: ' . $longestTime . "\n";
  133. echo "Query mais longa: \n" . $longestQuery . "\n";]]>
  134. </programlisting>
  135. </sect2>
  136. <sect2 id="zend.db.profiler.advanced">
  137. <title>Uso Avançado do Profiller</title>
  138. <para>
  139. Além da inspeção de consultas, o profiler também permite ao devenvolvedor
  140. filtrar quais consultas sejam analisadas. Os seguintes métodos
  141. operam em uma instância de <code>Zend_Db_Profiler</code>.
  142. </para>
  143. <sect3 id="zend.db.profiler.advanced.filtertime">
  144. <title>Filtro por tempo decorrido das consultas</title>
  145. <para>
  146. <code>setFilterElapsedSecs()</code> permite ao desenvolvedor setar um
  147. tempo mínimo para uma consulta antes de ela ser analisada.
  148. Para remover o filtro, passe para o método um valor nulo.
  149. </para>
  150. <programlisting role="php"><![CDATA[<?php
  151. // Apenas consultas analisadas que levam ao menos 5 segundos:
  152. $profiler->setFilterElapsedSecs(5);
  153. // Todas as consultas analisadas, não importando o tamanho:
  154. $profiler->setFilterElapsedSecs(null);]]>
  155. </programlisting>
  156. </sect3>
  157. <sect3 id="zend.db.profiler.advanced.filtertype">
  158. <title>Filtro pelo tipo de consulta</title>
  159. <para>
  160. <code>setFilterQueryType()</code> permite ao desenvolvedor setar
  161. quais tipos de consultas deverão ser analisadas; para analisar
  162. múltiplos tipos, lógicos ou todas. Os tipos de consultas são definidas
  163. segundo as constantes de <code>Zend_Db_Profiler</code>
  164. </para>
  165. <itemizedlist>
  166. <listitem>
  167. <para>
  168. <code>Zend_Db_Profiler::CONNECT</code>: operações de conexão,
  169. ou seleção de base de dados.
  170. </para>
  171. </listitem>
  172. <listitem>
  173. <para>
  174. <code>Zend_Db_Profiler::QUERY</code>: consultas gerais da
  175. base de dados que não se encaixam com outro tipos.
  176. </para>
  177. </listitem>
  178. <listitem>
  179. <para>
  180. <code>Zend_Db_Profiler::INSERT</code>: qualquer consulta que
  181. adicionar novos dados para a base de dados, geralmente um INSERT SQL.
  182. </para>
  183. </listitem>
  184. <listitem>
  185. <para>
  186. <code>Zend_Db_Profiler::UPDATE</code>: qualquer consulta que
  187. atualiza dados existentes, geralmente um UPDATE SQL.
  188. </para>
  189. </listitem>
  190. <listitem>
  191. <para>
  192. <code>Zend_Db_Profiler::DELETE</code>: qualquer consulta que
  193. exclui dados existentes, geralmente um DELETE SQL.
  194. </para>
  195. </listitem>
  196. <listitem>
  197. <para>
  198. <code>Zend_Db_Profiler::SELECT</code>: qualquer consulta que
  199. retorna dados existentes, geralmente um SELECT SQL.
  200. </para>
  201. </listitem>
  202. <listitem>
  203. <para>
  204. <code>Zend_Db_Profiler::TRANSACTION</code>: qualquer
  205. operação transacional, como a inicialição da transação, commit ou rollback.
  206. </para>
  207. </listitem>
  208. </itemizedlist>
  209. <para>
  210. Assim como usando o <code>setFilterElapsedSecs()</code>, você pode remover
  211. quaisquer filtros existentes passando <code>null</code> como único argumento.
  212. </para>
  213. <programlisting role="php"><![CDATA[<?php
  214. // Analisa somente consultas usando SELECT
  215. $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT);
  216. // Analisa as consultas SELECT, INSERT e UPDATE
  217. $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
  218. // Analisa a instrução DELETE (então podemos descobrir porque os dados continuam desaparecendo)
  219. $profiler->setFilterQueryType(Zend_Db_Profiler::DELETE);
  220. // Remove totos os filtros
  221. $profiler->setFilterQueryType(null);]]>
  222. </programlisting>
  223. </sect3>
  224. <sect3 id="zend.db.profiler.advanced.getbytype">
  225. <title>Retorna análises por tipo de consulta</title>
  226. <para>
  227. Usando o <code>setFilterQueryType()</code>, podemos resumir as análises geradas.
  228. Entretanto, às vezes é mais útil manter todas as análises e visualizar somente
  229. aquelas que você precisa num determinado momento. Outra funcionalidade do
  230. <code>getQueryProfiles()</code> é a capacidade de fazer esta filtragem
  231. "on-the-fly" (execução de código em tempo de execução),
  232. passando o tipo da consulta(ou uma combinação lógica de tipos) em seu primeiro argumento;
  233. veja na <xref linkend="zend.db.profiler.advanced.filtertype" />
  234. uma lista de todas as constantes dos tipos de consultas.
  235. </para>
  236. <programlisting role="php"><![CDATA[<?php
  237. // Retorna apenas consultas SELECT analisadas
  238. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);
  239. // Retorna apenas anásiles de consultas SELECT, INSERT e UPDATE.
  240. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
  241. // Retorna as análises feitas na instrução DELETE (então podemos descobrir porque os dados continuam desaparecendo)
  242. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);]]>
  243. </programlisting>
  244. </sect3>
  245. </sect2>
  246. </sect1>
  247. <!--
  248. vim:se ts=4 sw=4 et:
  249. -->