Zend_Db_Profiler.xml 16 KB

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