Zend_Db_Profiler.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 13846 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.db.profiler" xmlns:xi="http://www.w3.org/2001/XInclude">
  5. <title>Zend_Db_Profiler</title>
  6. <sect2 id="zend.db.profiler.introduction">
  7. <title>Introduction</title>
  8. <para><classname>Zend_Db_Profiler</classname> peut être activé pour permettre le profilage de requête. Les profils
  9. incluent les requêtes exécutées par l'adaptateur, ainsi que leur temps d'exécution, permettant l'inspection des
  10. requêtes qui ont été exécutées sans avoir besoin de rajouter le code spécifique de débogage aux classes.
  11. L'utilisation avancée permet aussi au développeur de filtrer quelles requêtes il souhaite profiler.</para>
  12. <para>Le profileur s'active soit en passant une directive au constructeur de l'adaptateur, soit en spécifiant à
  13. l'adaptateur de l'activer plus tard.</para>
  14. <programlisting role="php"><![CDATA[
  15. $params = array(
  16. 'host' => '127.0.0.1',
  17. 'username' => 'webuser',
  18. 'password' => 'xxxxxxxx',
  19. 'dbname' => 'test',
  20. 'profiler' => true // active le profileur ;
  21. // mettre à false pour désactiver
  22. // (désactivé par défaut)
  23. );
  24. $db = Zend_Db::factory('PDO_MYSQL', $params);
  25. // stoppe le profileur :
  26. $db->getProfiler()->setEnabled(false);
  27. // active le profileur :
  28. $db->getProfiler()->setEnabled(true);
  29. ]]></programlisting>
  30. <para>La valeur de l'option <code>profiler</code> est souple. Elle est interprétée différemment suivant son
  31. type. La plupart du temps, vous devriez simplement utiliser une variable booléenne, mais d'autres valeurs vous
  32. permettent de personnaliser le comportement du profileur.</para>
  33. <para>Un argument booléen active le profileur si c'est une valeur <code>true</code>, ou le désactive si
  34. <code>false</code>. La classe de profileur est celle par défaut, par exemple <classname>Zend_Db_Profiler</classname>.
  35. <programlisting role="php"><![CDATA[
  36. $params['profiler'] = true;
  37. $db = Zend_Db::factory('PDO_MYSQL', $params);
  38. ]]></programlisting></para>
  39. <para>Une instance d'un objet profileur fait que l'adaptateur utilise cet objet. L'objet doit être de type
  40. <classname>Zend_Db_Profiler</classname> ou une sous-classe. L'activation du profileur est faite séparément.
  41. <programlisting role="php"><![CDATA[
  42. $profiler = Mon_Db_Profiler();
  43. $profiler->setEnabled(true);
  44. $params['profiler'] = $profiler;
  45. $db = Zend_Db::factory('PDO_MYSQL', $params);
  46. ]]></programlisting></para>
  47. <para>L'argument peut être un tableau associatif contenant une ou toutes les clés suivantes :
  48. "<code>enabled</code>", "<code>instance</code>", et "<code>class</code>". Les clés "<code>enabled</code>" et
  49. "<code>instance</code>" correspondent aux types booléen et instance décrites ci-dessus. La clé
  50. "<code>class</code>" est utilisée pour nommer une classe à prendre en tant que profileur personnalisé. La classe
  51. doit être de type <classname>Zend_Db_Profiler</classname> ou une sous-classe. La classe est instanciée sans aucun argument
  52. de constructeur. L'option "<code>class</code>" est ignorée quand l'option "<code>instance</code>" est fournie.
  53. <programlisting role="php"><![CDATA[
  54. $params['profiler'] = array(
  55. 'enabled' => true,
  56. 'class' => 'Mon_Db_Profiler'
  57. );
  58. $db = Zend_Db::factory('PDO_MYSQL', $params);
  59. ]]></programlisting></para>
  60. <para>Enfin, l'argument peut être un objet de type <classname>Zend_Config</classname> contenant des propriétés, qui sont
  61. traitées comme les clés de tableaux décrites ci-dessus. Par exemple, une fichier "config.ini" peut contenir les
  62. données suivantes : <programlisting role="ini"><![CDATA[
  63. [main]
  64. db.profiler.class = "Mon_Db_Profiler"
  65. db.profiler.enabled = true
  66. ]]></programlisting> Cette configuration peut être appliquée par le code PHP suivant : <programlisting
  67. role="php"><![CDATA[
  68. $config = new Zend_Config_Ini('config.ini', 'main');
  69. $params['profiler'] = $config->db->profiler;
  70. $db = Zend_Db::factory('PDO_MYSQL', $params);
  71. ]]></programlisting> La propriété "<code>instance</code>" peut être utilisée comme ceci : <programlisting
  72. role="php"><![CDATA[
  73. $profiler = new Mon_Db_Profiler();
  74. $profiler->setEnabled(true);
  75. $configData = array(
  76. 'instance' => $profiler
  77. );
  78. $config = new Zend_Config($configData);
  79. $params['profiler'] = $config;
  80. $db = Zend_Db::factory('PDO_MYSQL', $params);
  81. ]]></programlisting></para>
  82. </sect2>
  83. <sect2 id="zend.db.profiler.using">
  84. <title>Utiliser le profileur</title>
  85. <para>A n'importe quel moment, vous pouvez récupérer le profileur en utilisant la méthode
  86. <code>getProfiler()</code> de l'adaptateur :</para>
  87. <programlisting role="php"><![CDATA[
  88. $profileur = $db->getProfiler();
  89. ]]></programlisting>
  90. <para>Ceci retourne une instance de <classname>Zend_Db_Profiler</classname>. Avec cette instance, le développeur peut
  91. examiner les requêtes en utilisant un éventail de méthodes :</para>
  92. <itemizedlist>
  93. <listitem>
  94. <para><code>getTotalNumQueries()</code> retourne le nombre total de requêtes profilées.</para>
  95. </listitem>
  96. <listitem>
  97. <para><code>getTotalElapsedSecs()</code> retourne le nombre total de secondes écoulées pour chaque
  98. requête profilée.</para>
  99. </listitem>
  100. <listitem>
  101. <para><code>getQueryProfiles()</code> retourne un tableau de tous les profils de requêtes.</para>
  102. </listitem>
  103. <listitem>
  104. <para><code>getLastQueryProfile()</code> retourne le profil de requête le plus récent, peut importe si
  105. la requête à fini de s'exécuter ou pas (si l'exécution n'est pas finie, le temps de fin sera
  106. <code>null</code>).</para>
  107. </listitem>
  108. <listitem>
  109. <para><code>clear()</code> nettoie tous les anciens profils de la pile.</para>
  110. </listitem>
  111. </itemizedlist>
  112. <para>La valeur de retour de <code>getLastQueryProfile()</code> et les éléments individuels de
  113. <code>getQueryProfiles()</code> sont des objets de type <classname>Zend_Db_Profiler_Query</classname> qui permettent
  114. d'inspecter les requêtes :</para>
  115. <itemizedlist>
  116. <listitem>
  117. <para><code>getQuery()</code> retourne le SQL de la requête sous forme de texte. Le texte de SQL d'une
  118. requête préparée avec des paramètres est le texte au moment où la requête a été préparée, donc il
  119. contient les emplacements de paramètre, mais pas les valeurs utilisées quand la déclaration est
  120. exécutée.</para>
  121. </listitem>
  122. <listitem>
  123. <para><code>getQueryParams()</code> retourne un tableau des valeurs de paramètres utilisées lors de
  124. l'exécution d'une requête préparée. Ceci inclue à la fois les paramètres attachés et les arguments de de
  125. la méthode <code>execute()</code>. Les clés du tableau sont les positions (base 1) ou les noms des
  126. paramètres.</para>
  127. </listitem>
  128. <listitem>
  129. <para><code>getElapsedSecs()</code> retourne le nombre de secondes d'exécution de la requête.</para>
  130. </listitem>
  131. </itemizedlist>
  132. <para>L'information que <classname>Zend_Db_Profiler</classname> fourni est utile pour profiler des goulots d'étranglement
  133. dans les applications, ainsi que pour déboguer les requêtes qui viennent d'être exécutées. Par exemple, pour
  134. voir la dernière requête qui vient de s'exécuter :</para>
  135. <programlisting role="php"><![CDATA[
  136. $query = $profileur->getLastQueryProfile();
  137. echo $query->getQuery();
  138. ]]></programlisting>
  139. <para>Si une page se génère lentement, utilisez le profileur pour déterminer le nombre total de requêtes, et
  140. ensuite passer d'une requête à l'autre pour voir laquelle a été la plus longue:</para>
  141. <programlisting role="php"><![CDATA[
  142. $tempsTotal = $profileur->getTotalElapsedSecs();
  143. $nombreRequetes = $profileur->getTotalNumQueries();
  144. $tempsLePlusLong = 0;
  145. $requeteLaPlusLongue = null;
  146. foreach ($profileur->getQueryProfiles() as $query) {
  147. if ($query->getElapsedSecs() > $tempsLePlusLong) {
  148. $tempsLePlusLong = $query->getElapsedSecs();
  149. $requeteLaPlusLongue = $query->getQuery();
  150. }
  151. }
  152. echo 'Exécution de '
  153. . $nombreRequetes
  154. . ' requêtes en '
  155. . $tempsTotal
  156. . ' secondes' . "\n";
  157. echo 'Temps moyen : '
  158. . $tempsTotal / $nombreRequetes
  159. . ' secondes' . "\n";
  160. echo 'Requêtes par seconde: '
  161. . $nombreRequetes / $tempsTotal
  162. . ' seconds' . "\n";
  163. echo 'Requête la plus lente (secondes) : '
  164. . $tempsLePlusLong . "\n";
  165. echo "Requête la plus lente (SQL) : \n"
  166. . $requeteLaPlusLongue . "\n";
  167. ]]></programlisting>
  168. </sect2>
  169. <sect2 id="zend.db.profiler.advanced">
  170. <title>Utilisation avancée du profileur</title>
  171. <para>En plus de l'inspection de requête, le profileur permet aussi au développeur de filtrer quelles requêtes
  172. il veut profiler. Les méthodes suivantes fonctionnent avec une instance de <classname>Zend_Db_Profiler</classname>
  173. :</para>
  174. <sect3 id="zend.db.profiler.advanced.filtertime">
  175. <title>Filtrer par temps d'exécution</title>
  176. <para><code>setFilterElapsedSecs()</code> permet au développeur de définir un temps minimum d'exécution de
  177. la requête avant que celle-ci soit profilée. Pour retirer le filtre, passez une valeur <code>null</code> à
  178. la méthode.</para>
  179. <programlisting role="php"><![CDATA[
  180. // Seules les requêtes qui durent au moins 5 secondes sont profilées :
  181. $profileur->setFilterElapsedSecs(5);
  182. // Profil de toutes les requêtes, peu importe leur durée :
  183. $profileur->setFilterElapsedSecs(null);
  184. ]]></programlisting>
  185. </sect3>
  186. <sect3 id="zend.db.profiler.advanced.filtertype">
  187. <title>Filtrer par type de requête</title>
  188. <para><code>setFilterQueryType()</code> permet au développeur de définir quels types de requêtes doivent
  189. être profilées ; pour profiler des types multiples vous pouvez utiliser le OU logique. Les types de requêtes
  190. sont définis sous forme de constantes de <classname>Zend_Db_Profiler</classname> :</para>
  191. <itemizedlist>
  192. <listitem>
  193. <para><classname>Zend_Db_Profiler::CONNECT</classname> : opérations de connexion ou de sélection de base de
  194. données.</para>
  195. </listitem>
  196. <listitem>
  197. <para><classname>Zend_Db_Profiler::QUERY</classname> : requête générale qui ne correspond pas aux autres
  198. types.</para>
  199. </listitem>
  200. <listitem>
  201. <para><classname>Zend_Db_Profiler::INSERT</classname> : toute requête qui ajoute des données dans la base de
  202. données, généralement INSERT.</para>
  203. </listitem>
  204. <listitem>
  205. <para><classname>Zend_Db_Profiler::UPDATE</classname> : toute requête qui met à jour des données, généralement
  206. UPDATE.</para>
  207. </listitem>
  208. <listitem>
  209. <para><classname>Zend_Db_Profiler::DELETE</classname> : toute requête qui efface des données, généralement
  210. DELETE.</para>
  211. </listitem>
  212. <listitem>
  213. <para><classname>Zend_Db_Profiler::SELECT</classname> : toute requête qui récupère des données, généralement
  214. SELECT.</para>
  215. </listitem>
  216. <listitem>
  217. <para><classname>Zend_Db_Profiler::TRANSACTION</classname> : toute requête qui concerne des opérations de
  218. transaction, comme start transaction, commit, ou rollback.</para>
  219. </listitem>
  220. </itemizedlist>
  221. <para>Comme avec <code>setFilterElapsedSecs()</code>, vous pouvez retirer tous les filtres en passant
  222. <code>null</code> comme unique argument.</para>
  223. <programlisting role="php"><![CDATA[
  224. // profile uniquement les requêtes SELECT
  225. $profileur->setFilterQueryType(Zend_Db_Profiler::SELECT);
  226. // profile les requêtes SELECT, INSERT, et UPDATE
  227. $profileur->setFilterQueryType(Zend_Db_Profiler::SELECT
  228. | Zend_Db_Profiler::INSERT
  229. | Zend_Db_Profiler::UPDATE);
  230. // profile les requêtes DELETE
  231. $profileur->setFilterQueryType(Zend_Db_Profiler::DELETE);
  232. // Efface tous les filtres
  233. $profileur->setFilterQueryType(null);
  234. ]]></programlisting>
  235. </sect3>
  236. <sect3 id="zend.db.profiler.advanced.getbytype">
  237. <title>Récupérer les profils par type de requête</title>
  238. <para>Utiliser <code>setFilterQueryType()</code> peut réduire les profils générés. Cependant il est parfois
  239. utile de garder tous les profils et voir uniquement ceux dont on a besoin, à un moment donné. Une autre
  240. possibilité de <code>getQueryProfiles()</code> est qu'il est possible de filtrer à la volée, en passant un
  241. type de requête (ou une combinaison logique de types de requête) comme premier argument ; voir <xref
  242. linkend="zend.db.profiler.advanced.filtertype" /> pour la liste des constantes de types de requête.</para>
  243. <programlisting role="php"><![CDATA[
  244. // Récupère uniquement les profils des requêtes SELECT
  245. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);
  246. // Récupère uniquement les profils des requêtes :
  247. // SELECT, INSERT, et UPDATE
  248. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT
  249. | Zend_Db_Profiler::INSERT
  250. | Zend_Db_Profiler::UPDATE);
  251. // Récupère uniquement les profils des requêtes DELETE
  252. // (on peut donc comprendre pourquoi les données disparaissent)
  253. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);
  254. ]]></programlisting>
  255. </sect3>
  256. </sect2>
  257. <sect2 id="zend.db.profiler.profilers">
  258. <title>Profileurs spécialisés</title>
  259. <para>Un profileur spécialisé est un objet qui hérite de <classname>Zend_Db_Profiler</classname>. Les profileurs
  260. spécialisés traitent les informations de profilage de manière spécifique.</para>
  261. <xi:include href="Zend_Db_Profiler-Firebug.xml" />
  262. </sect2>
  263. </sect1>