Cuando nuestro sitio ya esta listo y trabajando, generalmente comenzamos a interesarnos en la forma de hacerlo tan rápido como sea posible. XDebug permite analizar el rendimiento, «profile», de nuestro sitio. El análisis de rendimiento permite determinar cuales métodos de un clase (o funciones) se ejecutan por más tiempo. Esto permite determinar los «cuellos de botella» en nuestro código e identificar los problemas de rendimiento.
Por cada petición HTTP la extensión XDebug mide la cantidad de tiempo que una
función toma en su ejecución y escribe esta información en una archivo. Generalmente,
los archivos de análisis de rendimiento se almacenan dentro de la carpeta temporal
del sistema (la carpeta \tmp en GNU/Linux) y tienen nombres como xdebug.out.<timestamp>
,
donde <timestamp>
es la marca de tiempo de la petición HTTP. Todo lo que tenemos
que hacer es abrir el archivo y analizarlo.
Para habilitar el analizador de XDebug, debemos cambiar el siguiente parámetro de configuración en el archivo xdebug.ini:
xdebug.profiler_enable = 1
Desafortunadamente, NetBeans para PHP no incluye una herramienta para ver los resultados del análisis. Por esta razón debemos instalar una herramienta de visualización. Abajo, daremos instrucciones de como instalar una herramienta web simple llamada Webgrind. Webgrind puede trabajar sobre cualquier plataforma, la propia herramienta está escrita con PHP.
La instalación de Webgrind es sencillo.
Primero, necesitamos descargar webgrind de la página del proyecto y desempaquetarlo en alguna carpeta. En GNU/Linux, podemos hacer esto con los siguientes comandos:
$ cd ~
$ wget https://github.com/jokkedk/webgrind/archive/master.zip
$ unzip master.zip
El primer comando de arriba cambiará la carpeta de trabajo actual a nuestra carpeta home, luego descargaremos el archivo Webgrind desde internet y finalmente desempaquetamos el archivo.
Luego, necesitamos decirle al servidor web Apache donde encontrar los archivos de Webgrind. Esto significa que necesitamos configurar un sitio virtual. Ya hemos mostrado qué es un sitio virtual en el Apéndice A. Configuración del Entorno de Desarrollo Web. No olvidemos reiniciar el servidor web Apache después de tener configurado el sitio virtual.
Finalmente, abrimos Webgrind en nuestro navegador web colocando la URL de la instalación de Webgrind. Por ejemplo, si configuramos el sitio virtual para escuchar en el puerto 8080, escribimos en la barra de navegación del navegador web «http://localhost:8080» y presionamos Enter. La página web de Webgrind aparecerá (ver figura B.13):
En la cabecera de la página de Webgrind podemos seleccionar el porcentaje de las funciones llamadas en razón de su peso (figura B.14). Por defecto está configurado en 90%. Si configuramos un porcentaje bajo se ocultarán las funciones que son llamadas pocas veces.
Figure B.14. Selección del Porcentaje Webgrind
La lista desplegable que está a la derecha del campo de porcentaje nos permite seleccionar el archivo de datos que se someterá a análisis. Por defecto, se coloca «Auto (newest)» que obliga a Webgrind a usar el archivo con la marca de tiempo más reciente. Podríamos necesitar seleccionar otra archivo, por ejemplo, en el caso de que nuestra página web usara peticiones AJAX asíncronas.
La lista desplegable que está mas a la derecha permite asignar la unidad de medida que se usará para medir los datos. Las opciones posibles son: porcentaje (por defecto), mili-segundos y micro-segundos.
Si seleccionamos el porcentaje, el nombre del archivo, la unidad de medida y hacemos clic en el botón Update veremos la visualización de los datos hecha por Webgrind (el cálculo puede tardar algunos segundos). Cuando termine el cálculo seremos capaces de ver una tabla con la lista de las llamadas a funciones ordenadas de manera descendente o por el «peso» de la función. Las funciones más pesadas serán mostradas en la parte superior.
La tabla tiene las siguientes columnas:
La primera columna (Function) muestra el nombre de la clase seguido por el nombre del método (en caso de la llamada a un método) o el nombre de la función (en caso de una función regular).
La segunda columna contiene los iconos de «párrafo». Si hacemos clic en ellos podemos ver el código fuente PHP de la función correspondiente.
La columna Invocation Count muestra el número de veces que fue llamada la función.
La columna Total Self Cost muestra el tiempo total que toma la ejecución del código interno de PHP para la función listada (excluyendo el tiempo gastado en la ejecución de las otras funciones no estándar).
La columna Total Inclusive Cost contiene el tiempo total de ejecución para la función, que incluye el código interno de PHP y las funciones de usuario.
Haciendo clic en el encabezado de una columna podemos ordenar los datos de manera ascendente o descendente.
Podemos hacer clic en el triangulo que está al lado del nombre de la función para expandir la lista de invocaciones a la función. Esta lista permite ver quien llamo a esta función y que cantidad de tiempo consumió, la lista tiene las siguientes columnas:
La barra coloreada en la parte superior de la página muestra la proporción de los diferentes tipos de función:
Observemos que el análisis crea un nuevo archivo de datos en la carpeta /tmp para cada petición HTTP a nuestro sitio web. Esto puede causar el agotamiento del espacio en disco. Por esta razón, cuando hemos terminado de generar el análisis de rendimiento de la aplicación es recomendable desactivarlo editando el archivo php.ini comentando el parámetro
xdebug.profiler_enable
de la siguiente manera y luego reiniciar el servidor web Apache.
;xdebug.profiler_enable = 0