Zend_Db_Profiler.xml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15103 -->
  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>Introducción</title>
  8. <para>
  9. <classname>Zend_Db_Profiler</classname> puede ser habilitado para Perfilar las
  10. consultas. Los Perfiles incluyen la consulta procesada por el adaptador como
  11. el tiempo as transcurrido en la ejecución de las consultas, permitiendo
  12. inspeccionar las consultas realizadas win necesidad de agregar información
  13. de depuración extra en el código de las clases. El uso avanzado también permite
  14. que el desarrollador filtre las consultas que desea perfilar.
  15. </para>
  16. <para>
  17. Habilite el perfilador pasando una directiva al al constructor del adaptador,
  18. o pidiendole al adaptador permitirlo más adelante.
  19. </para>
  20. <programlisting language="php"><![CDATA[
  21. $params = array(
  22. 'host' => '127.0.0.1',
  23. 'username' => 'webuser',
  24. 'password' => 'xxxxxxxx',
  25. 'dbname' => 'test'
  26. 'profiler' => true // enciende el perfilador
  27. // establezca false para deshabilitar (está deshabilitado por defecto)
  28. );
  29. $db = Zend_Db::factory('PDO_MYSQL', $params);
  30. // apagar el perfilador:
  31. $db->getProfiler()->setEnabled(false);
  32. // encender el perfilador:
  33. $db->getProfiler()->setEnabled(true);
  34. ]]></programlisting>
  35. <para>
  36. El valor de la opción '<methodname>profiler</methodname>' es flexible. Es interpretada de distintas
  37. formas dependiendo del tipo. Normalmente, debería usar un valor booleano simple, pero
  38. otros tipos le permiten personalizar el comportamiento del perfilador.
  39. </para>
  40. <para>
  41. Un argumento booleano establece el perfilador como habilitado si el valor es
  42. <methodname>true</methodname>, o deshabilitado si es <methodname>false</methodname>. La clase del perfilador
  43. es el la clase de perfilador por defecto del adaptador, <classname>Zend_Db_Profiler</classname>.
  44. <programlisting language="php"><![CDATA[
  45. $params['profiler'] = true;
  46. $db = Zend_Db::factory('PDO_MYSQL', $params);
  47. ]]></programlisting>
  48. </para>
  49. <para>
  50. Una instancia del objeto perfilador hace que el adaptador use ese objeto.
  51. El tipo del objeto debe ser <classname>Zend_Db_Profiler</classname> o una subclase de este.
  52. Habilitar el perfilador se hace por separado.
  53. <programlisting language="php"><![CDATA[
  54. $profiler = MyProject_Db_Profiler();
  55. $profiler->setEnabled(true);
  56. $params['profiler'] = $profiler;
  57. $db = Zend_Db::factory('PDO_MYSQL', $params);
  58. ]]></programlisting>
  59. </para>
  60. <para>
  61. El argumento puede ser un array asociativo conteniendo algunas o todas las claves
  62. '<methodname>enabled</methodname>', '<methodname>instance</methodname>', y '<methodname>class</methodname>'. Las claves
  63. '<methodname>enabled</methodname>' e '<methodname>instance</methodname>' corresponden a los tipos booleano y
  64. la instancia documentada previamente. La clave '<methodname>class</methodname>' es usada para nombrar
  65. la clase que usará el perfilador personalizado. La clase debe ser
  66. <classname>Zend_Db_Profiler</classname> o una subclase. La clase es instanciada sin argumentos
  67. de constructor. La opción '<methodname>class</methodname>' es ignorada cuando la opción
  68. '<methodname>instance</methodname>' está dada.
  69. <programlisting language="php"><![CDATA[
  70. $params['profiler'] = array(
  71. 'enabled' => true,
  72. 'class' => 'MyProject_Db_Profiler'
  73. );
  74. $db = Zend_Db::factory('PDO_MYSQL', $params);
  75. ]]></programlisting>
  76. </para>
  77. <para>
  78. Finalmente, el argumento puede ser un objeto de tipo <methodname>Zend_Config</methodname>
  79. conteniendo las propiedades, que son tratadas como las claves de array descritas recién.
  80. Por ejemplo, un archivo "config.ini" puede contener los siguientes datos:
  81. <programlisting language="ini"><![CDATA[
  82. [main]
  83. db.profiler.class = "MyProject_Db_Profiler"
  84. db.profiler.enabled = true
  85. ]]></programlisting>
  86. Esta configuración puede ser aplicada con el siguiente código PHP:
  87. <programlisting language="php"><![CDATA[
  88. $config = new Zend_Config_Ini('config.ini', 'main');
  89. $params['profiler'] = $config->db->profiler;
  90. $db = Zend_Db::factory('PDO_MYSQL', $params);
  91. ]]></programlisting>
  92. La propiedad '<methodname>instance</methodname>' debe ser usada como el siguiente ejemplo:
  93. <programlisting language="php"><![CDATA[
  94. $profiler = new MyProject_Db_Profiler();
  95. $profiler->setEnabled(true);
  96. $configData = array(
  97. 'instance' => $profiler
  98. );
  99. $config = new Zend_Config($configData);
  100. $params['profiler'] = $config;
  101. $db = Zend_Db::factory('PDO_MYSQL', $params);
  102. ]]></programlisting>
  103. </para>
  104. </sect2>
  105. <sect2 id="zend.db.profiler.using">
  106. <title>Usando el Perfilador</title>
  107. <para>
  108. En este punto, obtenemos el perfilador usando el método
  109. <methodname>getProfiler()</methodname> del adaptador:
  110. </para>
  111. <programlisting language="php"><![CDATA[
  112. $profiler = $db->getProfiler();
  113. ]]></programlisting>
  114. <para>
  115. Este retorna una instancia del objeto <classname>Zend_Db_Profiler</classname>. Con
  116. esta instancia, el desarrollador puede examinar las consultar usando una variedad
  117. de métodos:
  118. </para>
  119. <itemizedlist>
  120. <listitem>
  121. <para>
  122. <methodname>getTotalNumQueries()</methodname> retorna el número total
  123. de consultas que han sido perfiladas.
  124. </para>
  125. </listitem>
  126. <listitem>
  127. <para>
  128. <methodname>getTotalElapsedSecs()</methodname> retorna el número total
  129. de segundos transcurridos en todas las consultas perfiladas.
  130. </para>
  131. </listitem>
  132. <listitem>
  133. <para>
  134. <methodname>getQueryProfiles()</methodname> retorna un array con todos
  135. los perfiles de consultas.
  136. </para>
  137. </listitem>
  138. <listitem>
  139. <para>
  140. <methodname>getLastQueryProfile()</methodname> retorna el último perfil (más
  141. reciente) de consulta, independientemente de si la consulta ha
  142. terminado o no (si no lo ha hecho, la hora de finalización será nula).
  143. </para>
  144. </listitem>
  145. <listitem>
  146. <para>
  147. <methodname>clear()</methodname> limpia los perfiles de consulta de la pila.
  148. </para>
  149. </listitem>
  150. </itemizedlist>
  151. <para>
  152. El valor de retorno de <methodname>getLastQueryProfile()</methodname> y
  153. elementos individuales de <methodname>getQueryProfiles()</methodname> son
  154. <methodname>Zend_Db_Profiler_Query</methodname> objetos, que proporcionan la
  155. capacidad para inspeccionar cada una de las consultas:
  156. </para>
  157. <itemizedlist>
  158. <listitem>
  159. <para>
  160. <methodname>getQuery()</methodname> retorna el texto SQL de la consulta.
  161. El texto SQL de una declaración preparada con parámetros es el
  162. texto al tiempo en que la consulta fué preparada, por lo que contiene
  163. marcadores de posición, no los valores utilizados cuando la
  164. declaración se ejecuta.
  165. </para>
  166. </listitem>
  167. <listitem>
  168. <para>
  169. <methodname>getQueryParams()</methodname> retorna un array de
  170. los valores de los parámetros usados cuando se ejecuta una consulta preparada.
  171. Este incluye ambos parámetros y argumentos vinculados al método
  172. <methodname>execute()</methodname> de la declaración. Las claves del array
  173. son las posiciones (basado en 1) o indices de parámetros nombrados (string).
  174. </para>
  175. </listitem>
  176. <listitem>
  177. <para>
  178. <methodname>getElapsedSecs()</methodname> returna el número de segundos
  179. que tuvo la consulta al correr.
  180. </para>
  181. </listitem>
  182. </itemizedlist>
  183. <para>
  184. La información que <classname>Zend_Db_Profiler</classname> provee es útil para
  185. perfilar cuellos de botella en aplicaciones, y para depurar consultas que
  186. han sido ejecutadas. Por instancia, para ver la consulta exacta que tuvo la
  187. última ejecución:
  188. </para>
  189. <programlisting language="php"><![CDATA[
  190. $query = $profiler->getLastQueryProfile();
  191. echo $query->getQuery();
  192. ]]></programlisting>
  193. <para>
  194. Tal vez una página se genera lentamente; use el perfilador para
  195. determinar primero el número total de segundos de todas las consultas,
  196. y luego recorrer paso a paso a través de las consultas para encontrar
  197. la más lenta:
  198. </para>
  199. <programlisting language="php"><![CDATA[
  200. $totalTime = $profiler->getTotalElapsedSecs();
  201. $queryCount = $profiler->getTotalNumQueries();
  202. $longestTime = 0;
  203. $longestQuery = null;
  204. foreach ($profiler->getQueryProfiles() as $query) {
  205. if ($query->getElapsedSecs() > $longestTime) {
  206. $longestTime = $query->getElapsedSecs();
  207. $longestQuery = $query->getQuery();
  208. }
  209. }
  210. echo 'Ejecutadas ' . $queryCount . ' consultas en ' . $totalTime .
  211. ' segundos' . "\n";
  212. echo 'Promedio de tiempo de consulta: ' . $totalTime / $queryCount .
  213. ' segundos' . "\n";
  214. echo 'Consultas por segundo: ' . $queryCount / $totalTime . "\n";
  215. echo 'Tardanza de la consulta más lenta: ' . $longestTime . "\n";
  216. echo "Consulta más lenta: \n" . $longestQuery . "\n";
  217. ]]></programlisting>
  218. </sect2>
  219. <sect2 id="zend.db.profiler.advanced">
  220. <title>Uso avanzado del Perfilador</title>
  221. <para>
  222. Además de la inspección de consultas, el perfilador también le permite
  223. al desarrollador filtrar que consultas serán perfiladas. El siguiente método
  224. opera en una instancia de <classname>Zend_Db_Profiler</classname>:
  225. </para>
  226. <sect3 id="zend.db.profiler.advanced.filtertime">
  227. <title>Filtrar por tiempo transcurrido en consulta</title>
  228. <para>
  229. <methodname>setFilterElapsedSecs()</methodname> le permite al desarrolador establecer
  230. un tiempo mínimo antes de que una consulta se perfile. Para remover el filtro,
  231. pase un valor null al método.
  232. </para>
  233. <programlisting language="php"><![CDATA[
  234. // Solo perfilar consultas que tardan más de 5 segundos:
  235. $profiler->setFilterElapsedSecs(5);
  236. // Perfilar todas las consultas sin importar el tiempo:
  237. $profiler->setFilterElapsedSecs(null);
  238. ]]></programlisting>
  239. </sect3>
  240. <sect3 id="zend.db.profiler.advanced.filtertype">
  241. <title>Filtrar por tipo de consulta</title>
  242. <para>
  243. <methodname>setFilterQueryType()</methodname> le permite al desarrollador
  244. establecer que tipo de consulta serán perfiladas; para perfilar multiples tipos,
  245. use un "OR" lógico. Los tipos de consulta se definen como las siguientes
  246. constantes de <classname>Zend_Db_Profiler</classname>:
  247. </para>
  248. <itemizedlist>
  249. <listitem>
  250. <para>
  251. <classname>Zend_Db_Profiler::CONNECT</classname>: operaciones de
  252. conexión o selección de base de datos.
  253. </para>
  254. </listitem>
  255. <listitem>
  256. <para>
  257. <classname>Zend_Db_Profiler::QUERY</classname>: consultas generales
  258. a la base de datos que no calzan con otros tipos.
  259. </para>
  260. </listitem>
  261. <listitem>
  262. <para>
  263. <classname>Zend_Db_Profiler::INSERT</classname>: cualquier consulta
  264. que agrega filas a la base de datos, generalmente un SQL INSERT.
  265. </para>
  266. </listitem>
  267. <listitem>
  268. <para>
  269. <classname>Zend_Db_Profiler::UPDATE</classname>: cualquier consulta que
  270. actualice registros existentes, usualmente un SQL UPDATE.
  271. </para>
  272. </listitem>
  273. <listitem>
  274. <para>
  275. <classname>Zend_Db_Profiler::DELETE</classname>: cualquier consulta
  276. que elimine datos existentes, usualmente un SQL DELETE.
  277. </para>
  278. </listitem>
  279. <listitem>
  280. <para>
  281. <classname>Zend_Db_Profiler::SELECT</classname>: cualquier consulta que
  282. retorne datos existentes, usualmente un SQL SELECT.
  283. </para>
  284. </listitem>
  285. <listitem>
  286. <para>
  287. <classname>Zend_Db_Profiler::TRANSACTION</classname>: cualquier
  288. operación transaccional, tal como iniciar una transacción, confirmar,
  289. o revertir.
  290. </para>
  291. </listitem>
  292. </itemizedlist>
  293. <para>
  294. Asi como con <classname>setFilterElapsedSecs()</classname>, puedes remover cualquier filtro
  295. existente pasando un <constant>NULL</constant> como único argumento.
  296. </para>
  297. <programlisting language="php"><![CDATA[
  298. // Perfilar solo consultas SELECT
  299. $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT);
  300. // Perfila consultas SELECT, INSERT, y UPDATE
  301. $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT |
  302. Zend_Db_Profiler::INSERT |
  303. Zend_Db_Profiler::UPDATE);
  304. // Perfilar consultas DELETE
  305. $profiler->setFilterQueryType(Zend_Db_Profiler::DELETE);
  306. // Remover todos los filtros
  307. $profiler->setFilterQueryType(null);
  308. ]]></programlisting>
  309. </sect3>
  310. <sect3 id="zend.db.profiler.advanced.getbytype">
  311. <title>Obtener perfiles por tipo de consulta</title>
  312. <para>
  313. Usando <methodname>setFilterQueryType()</methodname> puedes reducir los
  314. perfiles generados. Sin embargo, a veces puede ser más útil
  315. mantener todos los perfiles, pero ver sólo los que necesita
  316. en un determinado momento. Otra característica de
  317. <methodname>getQueryProfiles()</methodname> es que puede este filtrado al-vuelo,
  318. pasando un tipo de consulta(o una combinación lógica de tipos de consulta)
  319. en el primer; vea <xref linkend="zend.db.profiler.advanced.filtertype" />
  320. para una lista las constantes de tipo de consulta.
  321. </para>
  322. <programlisting language="php"><![CDATA[
  323. // Obtiene solo perfiles de consultas SELECT
  324. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);
  325. // Obtiene los perfiles de consultas SELECT, INSERT, y UPDATE
  326. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT |
  327. Zend_Db_Profiler::INSERT |
  328. Zend_Db_Profiler::UPDATE);
  329. // Obtiene solo perfiles de consultas DELETE
  330. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);
  331. ]]></programlisting>
  332. </sect3>
  333. </sect2>
  334. <sect2 id="zend.db.profiler.profilers">
  335. <title>Perfiladores Especializados</title>
  336. <para>
  337. Un Perfilador Especializado es un objeto que hereda de
  338. <classname>Zend_Db_Profiler</classname>. Los Perfiladores Especializados
  339. tratan la información de perfilado de maneras más especificas.
  340. </para>
  341. <xi:include href="Zend_Db_Profiler-Firebug.xml" />
  342. </sect2>
  343. </sect1>
  344. <!--
  345. vim:se ts=4 sw=4 et:
  346. -->