Zend_Db_Profiler.xml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <sect1 id="zend.db.profiler">
  2. <title>Zend_Db_Profiler</title>
  3. <sect2 id="zend.db.profiler.introduction">
  4. <title>Inleiding</title>
  5. <para>
  6. <code>Zend_Db_Profiler</code> kan worden geactiveerd om queries te profileren.
  7. Profielen bevatten de door de adapter uitgevoerde queries evenals de tijd die
  8. nodig was om de queries uit te voeren. Dit laat inspectie van de uitgevoerde
  9. queries toe zonder bijkomende debug code aan de klassen toe te voegen.
  10. Geavanceerd gebruik laat de ontwikkelaar filteren welke queries geprofileerd worden.
  11. </para>
  12. <para>
  13. Activeren van de profiler kan op twee wijzen gebeuren: een directive aan de
  14. adapter constructor doorgeven, of door de adapter te vragen het later te
  15. activeren.
  16. </para>
  17. <programlisting role="php"><![CDATA[<?php
  18. require_once 'Zend/Db.php';
  19. $params = array (
  20. 'host' => '127.0.0.1',
  21. 'username' => 'arthur',
  22. 'password' => '******',
  23. 'dbname' => 'camelot',
  24. 'profiler' => true // profiler activeren; naar false zetten om te de-activeren (standaard)
  25. );
  26. $db = Zend_Db::factory('PDO_MYSQL', $params);
  27. // profiler de-activeren:
  28. $db->getProfiler()->setEnabled(false);
  29. // profiler activeren:
  30. $db->getProfiler()->setEnabled(true);
  31. ?>]]></programlisting>
  32. </sect2>
  33. <sect2 id="zend.db.profiler.using">
  34. <title>De Profiler Gebruiken</title>
  35. <para>
  36. De profiler kan op eender welk moment worden aangeroepen
  37. via de <code>getProfiler()</code> methode van de adapter:
  38. </para>
  39. <programlisting role="php"><![CDATA[<?php
  40. $profiler = $db->getProfiler();
  41. ?>]]></programlisting>
  42. <para>
  43. Dit geeft een objectinstantie van <code>Zend_Db_Profiler</code> terug.
  44. Met deze instantie kan de ontwikkelaar je queries inspecteren via
  45. verscheidene methodes:
  46. </para>
  47. <itemizedlist>
  48. <listitem>
  49. <para>
  50. <code>getTotalNumQueries()</code> geeft het totaal aantal
  51. queries weer die werden geprofileerd.
  52. </para>
  53. </listitem>
  54. <listitem>
  55. <para>
  56. <code>getTotalElapsedSecs()</code> geeft het totaal aantal
  57. seconden weer die nodig waren om alle queries uit te voeren.
  58. </para>
  59. </listitem>
  60. <listitem>
  61. <para>
  62. <code>getQueryProfiles()</code> geeft een array van alle query
  63. profielen weer.
  64. </para>
  65. </listitem>
  66. <listitem>
  67. <para>
  68. <code>getLastQueryProfile()</code> geeft het laatste (meest recente)
  69. query profiel weer, ongeacht of de query volledig uitgevoerd is (indien niet, zal
  70. de eindtijd null zijn)
  71. </para>
  72. </listitem>
  73. <listitem>
  74. <para>
  75. <code>clear()</code> vaagt alle query profielen van de lijst weg.
  76. </para>
  77. </listitem>
  78. </itemizedlist>
  79. <para>
  80. De teruggegeven waarde van <code>getLastQueryProfile()</code> en de individuele
  81. elementen van <code>getQueryProfiles()</code> zijn <code>Zend_Db_Profiler_Query</code>
  82. objecten die je de mogelijkheid geven om de individuele queries zelf te inspecteren:
  83. </para>
  84. <itemizedlist>
  85. <listitem>
  86. <para>
  87. <code>getQuery()</code> geeft de SQL tekst van de query terug.
  88. </para>
  89. </listitem>
  90. <listitem>
  91. <para>
  92. <code>getElapsedSecs()</code> geeft het aantal seconden terug die de query
  93. nam om uitgevoerd te worden.
  94. </para>
  95. </listitem>
  96. </itemizedlist>
  97. <para>
  98. De informatie die <code>Zend_Db_Profiler</code> verstrekt is handig voor het profileren
  99. van opstoppers in programma's en voor het debuggen van gebruikte queries. Bijvoorbeeld,
  100. om de exacte laatst uitgevoerde query te zien:
  101. </para>
  102. <programlisting role="php"><![CDATA[<?php
  103. $query = $profiler->getLastQueryProfile();
  104. echo $query->getQuery();
  105. ?>]]></programlisting>
  106. <para>
  107. Misschien doet een pagina er lang over om afgebeeld te worden; gebruik dan de profiler
  108. om eerst het totaal aantal seconden van alle queries te verkrijgen, en dan de queries één
  109. voor één te doorlopen om uit te vinden welke het langste duurde:
  110. </para>
  111. <programlisting role="php"><![CDATA[<?php
  112. $totalTime = $profiler->getTotalElapsedSecs();
  113. $queryCount = $profiler->getTotalNumQueries();
  114. $longestTime = 0;
  115. $longestQuery = null;
  116. foreach ($profiler->getQueryProfiles() as $query) {
  117. if ($query->getElapsedSecs() > $longestTime) {
  118. $longestTime = $query->getElapsedSecs();
  119. $longestQuery = $query->getQuery();
  120. }
  121. }
  122. echo $queryCount . ' queries uitgevoerd in ' . $totalTime . ' seconden' . "\n";
  123. echo 'Gemiddelde query tijd: ' . $totalTime / $queryCount . ' seconden' . "\n";
  124. echo 'Queries per seconde: ' . $queryCount / $totalTime . "\n";
  125. echo 'Langste query tijd: ' . $longestTime . "\n";
  126. echo "Langste query: \n" . $longestQuery . "\n";
  127. ?>]]></programlisting>
  128. </sect2>
  129. <sect2 id="zend.db.profiler.advanced">
  130. <title>Geavanceerd Profiler Gebruik</title>
  131. <para>
  132. Bovenop query inspectie staat de profiler je ook toe de queries die worden
  133. geprofileerd te filteren. De volgende methodes kunnen op een
  134. <code>Zend_Db_Profiler</code> instantie worden uitgevoerd:
  135. </para>
  136. <sect3 id="zend.db.profiler.advanced.filtertime">
  137. <title>Filteren op afgelopen tijd</title>
  138. <para>
  139. <code>setFilterElapsedSecs()</code> laat je toe om een minimum
  140. query tijd te definiëren voordat een query wordt geprofileerd.
  141. Geef een null tijd aan de methode door om de filter te verwijderen.
  142. </para>
  143. <programlisting role="php"><![CDATA[<?php
  144. // Profileer alleen queries die langer dan 5 seconden duren:
  145. $profiler->setFilterElapsedSecs(5);
  146. // Profileer alle queries ongeacht de uitvoeringstijd:
  147. $profiler->setFilterElapsedSecs(null);
  148. ?>]]></programlisting>
  149. </sect3>
  150. <sect3 id="zend.db.profiler.advanced.filtertype">
  151. <title>Filteren per type query</title>
  152. <para>
  153. <code>setFilterQueryType()</code> laat je toe welk type queries moeten worden
  154. geprofileerd; om meerdere types te profileren geef je ze met een logische OR
  155. door. Query types zijn als de volgende <code>Zend_Db_Profiler</code> constanten
  156. gedefinieerd:
  157. </para>
  158. <itemizedlist>
  159. <listitem>
  160. <para>
  161. <code>Zend_Db_Profiler::CONNECT</code>: verbindingsoperaties, of het
  162. selecteren van een database.
  163. </para>
  164. </listitem>
  165. <listitem>
  166. <para>
  167. <code>Zend_Db_Profiler::QUERY</code>: standaard database queries die
  168. met geen ander type query overeenkomen.
  169. </para>
  170. </listitem>
  171. <listitem>
  172. <para>
  173. <code>Zend_Db_Profiler::INSERT</code>: eender welke query die data
  174. aan de database toevoegt, meestal SQL INSERT.
  175. </para>
  176. </listitem>
  177. <listitem>
  178. <para>
  179. <code>Zend_Db_Profiler::UPDATE</code>: eender welke query die bestaande
  180. data wijzigt, meestal SQL UPDATE.
  181. </para>
  182. </listitem>
  183. <listitem>
  184. <para>
  185. <code>Zend_Db_Profiler::DELETE</code>: eender welke query die bestaande
  186. data verwijdert, meestal SQL DELETE.
  187. </para>
  188. </listitem>
  189. <listitem>
  190. <para>
  191. <code>Zend_Db_Profiler::SELECT</code>: eender welke query die bestaande
  192. data opvraagt, meestal SQL SELECT.
  193. </para>
  194. </listitem>
  195. <listitem>
  196. <para>
  197. <code>Zend_Db_Profiler::TRANSACTION</code>: eender welke transactionele
  198. operatie, zoals een transactie starten, bevestigen (commit) of annuleren
  199. (rollback).
  200. </para>
  201. </listitem>
  202. </itemizedlist>
  203. <para>
  204. Zoals bij <code>setFilterElapsedSecs()</code> kan je elke bestaande filter verwijderen
  205. door <code>null</code> als enig argument door te geven.
  206. </para>
  207. <programlisting role="php"><![CDATA[<?php
  208. // profileer enkel SELECT queries
  209. $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT);
  210. // profileer SELECT, INSERT, en UPDATE queries
  211. $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
  212. // profileer DELETE queries (zodat we kunnnen uitvissen waarom data maar blijft verdwijnen)
  213. $profiler->setFilterQueryType(Zend_Db_Profiler::DELETE);
  214. // Alle filters verwijderen
  215. $profiler->setFilterQueryType(null);
  216. ?>]]></programlisting>
  217. </sect3>
  218. <sect3 id="zend.db.profiler.advanced.getbytype">
  219. <title>Profielen per type query verkrijgen</title>
  220. <para>
  221. Het gebruik van <code>setFilterQueryType()</code> kan het aantal gegenereerde profielen
  222. beperken. Soms is het echter handiger om alle profielen te behouden, maar enkel die te
  223. bekijken die je op dat moment nodig hebt. Een andere eigenschap van <code>getQueryProfiles()</code>
  224. is dat het kan filteren terwijl de code loopt, door het een type query (of een logische
  225. combinatie van querytypes) als eerste argument door te geven; zie
  226. <xref linkend="zend.db.profiler.advanced.filtertype" /> voor een lijst van de querytype
  227. constanten.
  228. </para>
  229. <programlisting role="php"><![CDATA[<?php
  230. // Alleen SELECT query profielen verkrijgen
  231. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);
  232. // Alleen SELECT, INSERT, en UPDATE query profielen verkrijgen
  233. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
  234. // Alleen DELETE query profielen verkrijgen (zodat we kunnen nagaan waarom data maar blijft verdwijnen)
  235. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);
  236. ?>]]></programlisting>
  237. </sect3>
  238. </sect2>
  239. </sect1>
  240. <!--
  241. vim:se ts=4 sw=4 et:
  242. -->