Advertisement
  1. Code
  2. PHP

Perfilado avanzado en CodeIgniter con XHProf

Scroll to top
Read Time: 8 min

Spanish (Español) translation by steven (you can also view the original English article)

Hay varias formas de perfilar y monitorear el rendimiento del código PHP en un entorno de desarrollo, pero una vez que se suelta en un servidor de producción, es extremadamente difícil saber qué está pasando cuando los usuarios acceden a tu aplicación.

En marzo de 2009, Facebook lanzó XHProf, un generador de perfiles de nivel de función que te permite identificar cuellos de botella en tu aplicación. Y se ejecuta en un servidor de producción con poca sobrecarga.

XHProf te proporcionará un perfil jerárquico de las funciones que llama tu aplicación, lo que te permitirá seguir la cadena de eventos que conducen a la ejecución de código intensivo en recursos. Podrás ver exactamente cuánto tiempo de muro (el tiempo real transcurrido), tiempo de CPU y memoria utiliza tu aplicación.

Este tutorial te ayudará a instalar XHProf en tu servidor e integrarlo con tu aplicación CodeIgniter a través de enlaces para que puedas comenzar a perfilar tu aplicación, en un entorno de producción, de inmediato. Todo lo que ves aquí fue escrito para Ubuntu 10.04, la última versión de LTS en el momento de escribir este artículo.


Instalación

La instalación de XHProf se puede realizar a través de PECL; dicho esto, nunca he podido instalar la versión PECL en Ubuntu fácilmente, por lo que es más fácil de instalar desde la fuente. Comienza descargando la última revisión desde la cuenta de GitHub de XHProf.

Extrae el contenido y accede a la carpeta 'tarball'; esto cambiará según la última revisión disponible en GitHub.

A continuación, realiza la instalación de forma normal.

Finalmente, necesitamos decirle a PHP que cargue la extensión. Crea un archivo de configuración para él. Realmente hago esto por limpieza, pero siempre puedes colocarlo al final de tu php.ini principal.

Y pega lo siguiente:

Esto le dice a XHProf que use el directorio en /var/tmp/xhprof para guardar sus datos de ejecución.

Puedes verificar si XHProf está instalado correctamente ingresando php -m en la línea de comandos y verificando que el módulo esté disponible. Recuerda reiniciar Apache para que también sea obtenido por tus aplicaciones web PHP.

Si deseas renderizar una gráfica de las llamadas, también necesitarás el paquete graphviz. Esto se puede obtener de apt.


Integración con CodeIgniter

XHProf se puede utilizar de forma ad-hoc para evaluar pequeños fragmentos de código, pero es más útil cuando le permites perfilar la página completa. En primer lugar, deberás mover el código XHProf a la raíz de tu aplicación web para que tenga acceso a las clases adecuadas.

CodeIgniter tiene un mecanismo excelente para inyectar código personalizado en la ejecución de una página llamada 'Hooks'. Esto es lo que usaremos para integrar XHProf con tu aplicación. Habilita los hooks en tu archivo application/config/config.php.

Luego especifica tus hooks en application/config/hooks.php.

Luego crea el hook que cargará XHProf en tu aplicación en application/hooks/xhprof.php. Esta clase proporcionará el mínimo necesario para que XHProf recopile datos de tu aplicación.

Hay algunas cosas a señalar en este ejemplo de código.

  • La variable $XHProfPath debe apuntar al directorio en el que instalaste XHProf. En nuestro ejemplo, lo colocamos en la raíz de la aplicación web, pero es posible que lo almacenes en un lugar central y se vincule simbólicamente con varias aplicaciones.
  • La variable $applicationName te permite especificar el nombre de la aplicación usando XHProf. Esto podría ser especialmente importante en un entorno en el que se ejecutan varias aplicaciones en el mismo servidor.
  • La variable $sampleSize te permite especificar un factor para la frecuencia con la que XHProf perfila una ejecución. En un entorno de producción en el que recibe miles de visitas, probablemente no valga la pena almacenar cada ejecución. Puedes aumentar esta variable para obtener una muestra aleatoria de ejecuciones. Cambiarlo a 10, por ejemplo, te dará un informe de una de cada 10 visitas a tu aplicación.

La función xhprof_enable() puede aceptar cualquier combinación de 3 constantes.

  • XHPROF_FLAGS_NO_BUILTINS: Omite todas las funciones internas de php. Agregar esto significa que solo verás el tiempo dedicado a las funciones que has escrito (o que son parte de CodeIgniter)
  • XHPROF_FLAGS_CPU: Agrega información adicional de los perfiles de la CPU.
  • XHPROF_FLAGS_MEMORY: Agrega información adicional de los  perfiles de memoria.

Combínalos usando +. Por ejemplo, xhprof_enable(XHPROF_FLAGS_NO_BUILTINS + XHPROF_FLAGS_MEMORY);.

Después de ejecutar tu aplicación un par de veces, apunta tu navegador al directorio de la aplicación XHProf http://localhost/xhprof/xhprof_html/index.php - ingresa la URL de tu servidor de desarrollo - y verás una lista de tu última aplicación ejecutada con la más nueva en la parte superior. Selecciona una de las ejecuciones para ver su información de perfil.


Evaluación de los resultados

Almacenar toda esta información de los perfiles está muy bien, pero saber cómo evaluarla es la clave para optimizar tu aplicación.

El 'Resumen general' es un buen lugar para comenzar; te mostrará:

  • Tiempo total de muro inclusivo: Cuánto tiempo (en microsegundos) tardó en generarse tu página.
  • Uso total de memoria: La memoria total utilizada por esta ejecución de tu aplicación.
  • Uso máximo de memoria total: La cantidad máxima de memoria que utilizó tu aplicación.
  • Número de llamadas a funciones: El número de funciones a las que llamó tu aplicación.
Run summary

Estos números deben brindarte una base general desde la que comenzar y proporcionar números de titulares para compararlos cuando comiences la optimización.

Debajo del resumen se encuentra el informe de ejecución detallado. Los cuellos de botella en tu aplicación deberían ser bastante obvios: son las llamadas a funciones en la parte superior del informe.

Wall reportWall reportWall report

Las cosas que más recursos requieren con las que probablemente te encontrarás serán aquellas que realizan llamadas a servicios externos o a tu base de datos. De forma predeterminada, los resultados se ordenan por "tiempo de muro inclusivo". Esto muestra las funciones que tardaron más en ejecutarse por el total acumulado de ellas y las funciones que llaman. Ordenar por 'tiempo de muro exclusivo' te permite ver las funciones específicas que están utilizando la mayor cantidad de recursos.

Hacer clic en una función te permite profundizar en más detalles sobre esa función y las funciones que llamó. A partir de ahí, será más fácil ver exactamente qué estaba haciendo tu función de larga duración y detectar cualquier problema.

Al depurar tu aplicación de CodeIgniter, uno de los mejores lugares para comenzar es por el controlador que se usa para llamar tu página Welcome::index en el ejemplo. Desde allí, puedes ver fácilmente el desglose de dónde pasó la mayor parte del tiempo el controlador.

Controller summaryController summaryController summary

Vista gráfica de las llamadas

XHProf puede generar una vista de gráfico de llamadas; la cual proporciona una pista visual de la ruta principal de tu aplicación. Los principales cuellos de botella están resaltados en rojo para mostrar dónde se gastan la mayoría de tus recursos.

CallgraphCallgraphCallgraph

Comparación de ejecuciones

XHProf proporciona un mecanismo para comparar múltiples ejecuciones; esto te permitirá realizar una serie de optimizaciones y luego ver cómo han afectado tu aplicación.

http://localhost/xhprof/xhprof_html/index.php?run1=run_id_1>&run2=run_id_2&source=applicationName

Nota: run_id_1 y run_id_2 deben ser los ID de algunas de tus ejecuciones anteriores y applicationName debe ser el nombre que especificaste al configurar el enlace anteriormente.

Esto proporcionará la misma información que ves en un informe regular, pero proporcionará estadísticas porcentuales sobre cualquier cambio desde la primera ejecución, lo que te permitirá ver fácilmente si tus optimizaciones están moviendo tu rendimiento en la dirección correcta.

Agregando ejecuciones

A veces, una sola ejecución puede no ser suficiente para evaluar exactamente lo que está sucediendo. Las páginas funcionan de forma ligeramente diferente según la cadena de consulta o la entrada del usuario, o puede haber diferencias en los mecanismos de almacenamiento en caché.

Agregar una cantidad de ejecuciones te permite combinar varias ejecuciones y recibir un promedio de los recursos consumidos.

http://localhost/xhprof/xhprof_html/index.php?run=run_id,run_id,run_id&source=applicationName

Nota: Cada run_id debe ser el identificador de algunas de tus ejecuciones anteriores y applicationName debe ser el nombre que especificaste al configurar el enlace anteriormente.


Resumen

Ahora deberías tener XHProf funcionando en tu aplicación de CodeIgniter y poder ver exactamente dónde pasa tu código la mayor parte del tiempo. La optimización puede ser una tarea difícil. A veces, no es tan simple como volver a implementar una función o agregar una capa de almacenamiento en caché. Pensar por qué estás haciendo algo y cuál es el efecto exacto que está teniendo en tu aplicación es igualmente importante.

Déjame saber si tienes alguna pregunta en los comentarios a continuación. ¡Muchas gracias por leer!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.