Zend_Db_Profiler.xml 16 KB

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