| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 19484 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.db.profiler" xmlns:xi="http://www.w3.org/2001/XInclude">
- <title>Zend_Db_Profiler</title>
- <sect2 id="zend.db.profiler.introduction">
- <title>Introducción</title>
- <para>
- <classname>Zend_Db_Profiler</classname>
- puede ser habilitado para
- Perfilar las consultas. Los Perfiles incluyen la consulta
- procesada
- por el adaptador como el tiempo as transcurrido en la ejecución de
- las
- consultas, permitiendo inspeccionar las consultas realizadas win
- necesidad de agregar
- información de depuración extra en el código de
- las clases. El uso avanzado también
- permite que el desarrollador
- filtre las consultas que desea perfilar.
- </para>
- <para>Habilite el perfilador pasando una directiva al al constructor
- del adaptador, o
- pidiendole al adaptador permitirlo más adelante.</para>
- <programlisting language="php"><![CDATA[
- $params = array(
- 'host' => '127.0.0.1',
- 'username' => 'webuser',
- 'password' => 'xxxxxxxx',
- 'dbname' => 'test'
- 'profiler' => true // enciende el perfilador
- // establezca false para deshabilitar (está deshabilitado por defecto)
- );
- $db = Zend_Db::factory('PDO_MYSQL', $params);
- // apagar el perfilador:
- $db->getProfiler()->setEnabled(false);
- // encender el perfilador:
- $db->getProfiler()->setEnabled(true);
- ]]></programlisting>
- <para>
- El valor de la opción '
- <property>profiler</property>
- ' es
- flexible. Es interpretada de distintas formas dependiendo del tipo.
- Normalmente,
- debería usar un valor booleano simple, pero otros tipos
- le permiten personalizar el
- comportamiento del perfilador.
- </para>
- <para>
- Un argumento booleano establece el perfilador como habilitado si
- el valor es
- <constant>TRUE</constant>
- , o deshabilitado si es
- <constant>FALSE</constant>
- . La clase del perfilador es el la
- clase de perfilador por defecto del adaptador,
- <classname>Zend_Db_Profiler</classname>
- .
- </para>
- <programlisting language="php"><![CDATA[
- $params['profiler'] = true;
- $db = Zend_Db::factory('PDO_MYSQL', $params);
- ]]></programlisting>
- <para>
- Una instancia del objeto perfilador hace que el adaptador use ese
- objeto. El tipo del
- objeto debe ser
- <classname>Zend_Db_Profiler</classname>
- o una subclase de este.
- Habilitar el perfilador se hace por separado.
- </para>
- <programlisting language="php"><![CDATA[
- $profiler = MyProject_Db_Profiler();
- $profiler->setEnabled(true);
- $params['profiler'] = $profiler;
- $db = Zend_Db::factory('PDO_MYSQL', $params);
- ]]></programlisting>
- <para>
- El argumento puede ser un array asociativo conteniendo algunas o
- todas las claves '
- <property>enabled</property>
- ',
- '
- <property>instance</property>
- ', y
- '
- <property>class</property>
- '. Las claves
- '
- <property>enabled</property>
- ' e
- '
- <property>instance</property>
- ' corresponden a los tipos
- booleano y la instancia documentada previamente. La clave
- '
- <property>class</property>
- ' es usada para nombrar la clase
- que usará el perfilador personalizado. La clase debe ser
- <classname>Zend_Db_Profiler</classname>
- o una subclase. La clase
- es instanciada sin argumentos de constructor. La opción
- '
- <property>class</property>
- ' es ignorada cuando la opción
- '
- <property>instance</property>
- ' está dada.
- </para>
- <programlisting language="php"><![CDATA[
- $params['profiler'] = array(
- 'enabled' => true,
- 'class' => 'MyProject_Db_Profiler'
- );
- $db = Zend_Db::factory('PDO_MYSQL', $params);
- ]]></programlisting>
- <para>
- Finalmente, el argumento puede ser un objeto de tipo
- <classname>Zend_Config</classname>
- conteniendo las
- propiedades, que son tratadas como las claves de array descritas
- recién.
- Por ejemplo, un archivo "
- <filename>config.ini</filename>
- " puede contener los
- siguientes datos:
- </para>
- <programlisting language="ini"><![CDATA[
- [main]
- db.profiler.class = "MyProject_Db_Profiler"
- db.profiler.enabled = true
- ]]></programlisting>
- <para>
- Esta configuración puede ser aplicada con el siguiente
- código
- <acronym>PHP</acronym>
- :
- </para>
- <programlisting language="php"><![CDATA[
- $config = new Zend_Config_Ini('config.ini', 'main');
- $params['profiler'] = $config->db->profiler;
- $db = Zend_Db::factory('PDO_MYSQL', $params);
- ]]></programlisting>
- <para>
- La propiedad '
- <methodname>instance</methodname>
- ' debe ser
- usada como el siguiente ejemplo:
- </para>
- <programlisting language="php"><![CDATA[
- $profiler = new MyProject_Db_Profiler();
- $profiler->setEnabled(true);
- $configData = array(
- 'instance' => $profiler
- );
- $config = new Zend_Config($configData);
- $params['profiler'] = $config;
- $db = Zend_Db::factory('PDO_MYSQL', $params);
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.db.profiler.using">
- <title>Usando el Perfilador</title>
- <para>
- En este punto, obtenemos el perfilador usando el método
- <methodname>getProfiler()</methodname>
- del adaptador:
- </para>
- <programlisting language="php"><![CDATA[
- $profiler = $db->getProfiler();
- ]]></programlisting>
- <para>
- Este retorna una instancia del objeto
- <classname>Zend_Db_Profiler</classname>
- . Con esta instancia, el
- desarrollador puede examinar las consultar usando una variedad
- de
- métodos:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>getTotalNumQueries()</methodname>
- retorna el
- número total de consultas que han sido perfiladas.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getTotalElapsedSecs()</methodname>
- retorna el
- número total de segundos transcurridos en todas las
- consultas
- perfiladas.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getQueryProfiles()</methodname>
- retorna un array
- con todos los perfiles de consultas.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getLastQueryProfile()</methodname>
- retorna el
- último perfil (más reciente) de consulta, independientemente
- de si la
- consulta ha terminado o no (si no lo ha hecho, la
- hora de finalización será
- nula).
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clear()</methodname>
- limpia los perfiles de
- consulta de la pila.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- El valor de retorno de
- <methodname>getLastQueryProfile()</methodname>
- y elementos
- individuales de
- <methodname>getQueryProfiles()</methodname>
- son
- <classname>Zend_Db_Profiler_Query</classname>
- objetos, que
- proporcionan la capacidad para inspeccionar cada una de las
- consultas:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>getQuery()</methodname>
- retorna el texto SQL de
- la consulta. El texto
- <acronym>SQL</acronym>
- de una declaración preparada con
- parámetros es el texto al tiempo en que la
- consulta fué
- preparada, por lo que contiene marcadores de posición, no
- los valores
- utilizados cuando la declaración se ejecuta.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getQueryParams()</methodname>
- retorna un array
- de los valores de los parámetros usados cuando se ejecuta
- una
- consulta preparada. Este incluye ambos parámetros y
- argumentos vinculados al
- método
- <methodname>execute()</methodname>
- de la declaración.
- Las claves del array son las posiciones (basado en 1) o
- indices de parámetros nombrados (string).
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getElapsedSecs()</methodname>
- returna el número
- de segundos que tuvo la consulta al correr.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- La información que
- <classname>Zend_Db_Profiler</classname>
- provee
- es útil para perfilar cuellos de botella en aplicaciones, y para
- depurar consultas
- que han sido ejecutadas. Por instancia, para ver
- la consulta exacta que tuvo la última
- ejecución:
- </para>
- <programlisting language="php"><![CDATA[
- $query = $profiler->getLastQueryProfile();
- echo $query->getQuery();
- ]]></programlisting>
- <para>Tal vez una página se genera lentamente; use el perfilador para
- determinar primero el
- número total de segundos de todas las
- consultas, y luego recorrer paso a paso a través de
- las consultas
- para encontrar la más lenta:</para>
- <programlisting language="php"><![CDATA[
- $totalTime = $profiler->getTotalElapsedSecs();
- $queryCount = $profiler->getTotalNumQueries();
- $longestTime = 0;
- $longestQuery = null;
- foreach ($profiler->getQueryProfiles() as $query) {
- if ($query->getElapsedSecs() > $longestTime) {
- $longestTime = $query->getElapsedSecs();
- $longestQuery = $query->getQuery();
- }
- }
- echo 'Ejecutadas ' . $queryCount . ' consultas en ' . $totalTime .
- ' segundos' . "\n";
- echo 'Promedio de tiempo de consulta: ' . $totalTime / $queryCount .
- ' segundos' . "\n";
- echo 'Consultas por segundo: ' . $queryCount / $totalTime . "\n";
- echo 'Tardanza de la consulta más lenta: ' . $longestTime . "\n";
- echo "Consulta más lenta: \n" . $longestQuery . "\n";
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.db.profiler.advanced">
- <title>Uso avanzado del Perfilador</title>
- <para>
- Además de la inspección de consultas, el perfilador también le
- permite al desarrollador
- filtrar que consultas serán perfiladas. El
- siguiente método opera en una instancia de
- <classname>Zend_Db_Profiler</classname>
- :
- </para>
- <sect3 id="zend.db.profiler.advanced.filtertime">
- <title>Filtrar por tiempo transcurrido en consulta</title>
- <para>
- <methodname>setFilterElapsedSecs()</methodname>
- le permite al
- desarrolador establecer un tiempo mínimo antes de que una
- consulta se
- perfile. Para remover el filtro, pase un valor
- <constant>NULL</constant>
- al método.
- </para>
- <programlisting language="php"><![CDATA[
- // Solo perfilar consultas que tardan más de 5 segundos:
- $profiler->setFilterElapsedSecs(5);
- // Perfilar todas las consultas sin importar el tiempo:
- $profiler->setFilterElapsedSecs(null);
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.db.profiler.advanced.filtertype">
- <title>Filtrar por tipo de consulta</title>
- <para>
- <methodname>setFilterQueryType()</methodname>
- le permite al
- desarrollador establecer que tipo de consulta serán perfiladas;
- para
- perfilar multiples tipos, use un "OR" lógico. Los tipos de
- consulta se definen como
- las siguientes constantes de
- <classname>Zend_Db_Profiler</classname>
- :
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <constant>Zend_Db_Profiler::CONNECT</constant>
- :
- operaciones de conexión o selección de base de datos.
- </para>
- </listitem>
- <listitem>
- <para>
- <constant>Zend_Db_Profiler::QUERY</constant>
- :
- consultas generales a la base de datos que no calzan con
- otros tipos.
- </para>
- </listitem>
- <listitem>
- <para>
- <constant>Zend_Db_Profiler::INSERT</constant>
- :
- cualquier consulta que agrega filas a la base de datos,
- generalmente un
- <acronym>SQL</acronym>
- INSERT.
- </para>
- </listitem>
- <listitem>
- <para>
- <constant>Zend_Db_Profiler::UPDATE</constant>
- :
- cualquier consulta que actualice registros existentes,
- usualmente un
- <acronym>SQL</acronym>
- UPDATE.
- </para>
- </listitem>
- <listitem>
- <para>
- <constant>Zend_Db_Profiler::DELETE</constant>
- :
- cualquier consulta que elimine datos existentes,
- usualmente un
- <acronym>SQL</acronym>
- DELETE.
- </para>
- </listitem>
- <listitem>
- <para>
- <constant>Zend_Db_Profiler::SELECT</constant>
- :
- cualquier consulta que retorne datos existentes,
- usualmente un
- <acronym>SQL</acronym>
- SELECT.
- </para>
- </listitem>
- <listitem>
- <para>
- <constant>Zend_Db_Profiler::TRANSACTION</constant>
- :
- cualquier operación transaccional, tal como iniciar una
- transacción,
- confirmar, o revertir.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Asi como con
- <methodname>setFilterElapsedSecs()</methodname>
- ,
- puedes remover cualquier filtro existente pasando un
- <constant>NULL</constant>
- como único argumento.
- </para>
- <programlisting language="php"><![CDATA[
- // Perfilar solo consultas SELECT
- $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT);
- // Perfila consultas SELECT, INSERT, y UPDATE
- $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT |
- Zend_Db_Profiler::INSERT |
- Zend_Db_Profiler::UPDATE);
- // Perfilar consultas DELETE
- $profiler->setFilterQueryType(Zend_Db_Profiler::DELETE);
- // Remover todos los filtros
- $profiler->setFilterQueryType(null);
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.db.profiler.advanced.getbytype">
- <title>Obtener perfiles por tipo de consulta</title>
- <para>
- Usando
- <methodname>setFilterQueryType()</methodname>
- puedes
- reducir los perfiles generados. Sin embargo, a veces puede ser
- más útil
- mantener todos los perfiles, pero ver sólo los que
- necesita en un determinado
- momento. Otra característica de
- <methodname>getQueryProfiles()</methodname>
- es que puede
- este filtrado al-vuelo, pasando un tipo de consulta(o una
- combinación
- lógica de tipos de consulta) en el primer; vea
- <xref linkend="zend.db.profiler.advanced.filtertype"/>
- para una
- lista las constantes de tipo de consulta.
- </para>
- <programlisting language="php"><![CDATA[
- // Obtiene solo perfiles de consultas SELECT
- $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);
- // Obtiene los perfiles de consultas SELECT, INSERT, y UPDATE
- $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT |
- Zend_Db_Profiler::INSERT |
- Zend_Db_Profiler::UPDATE);
- // Obtiene solo perfiles de consultas DELETE
- $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);
- ]]></programlisting>
- </sect3>
- </sect2>
- <sect2 id="zend.db.profiler.profilers">
- <title>Perfiladores Especializados</title>
- <para>
- Un Perfilador Especializado es un objeto que hereda de
- <classname>Zend_Db_Profiler</classname>
- . Los Perfiladores
- Especializados tratan la información de perfilado de maneras más
- especificas.
- </para>
- <xi:include href="Zend_Db_Profiler-Firebug.xml"/>
- </sect2>
- </sect1>
|