Zend_Db_Profiler.xml 19 KB

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