Buscar..


Perfilando con XHProf

XHProf es un generador de perfiles PHP originalmente escrito por Facebook, para proporcionar una alternativa más liviana a XDebug.

Después de instalar el módulo PHP xhprof , la creación de perfiles se puede habilitar / deshabilitar desde el código PHP:

xhprof_enable();
doSlowOperation();
$profile_data = xhprof_disable();

La matriz devuelta contendrá datos sobre el número de llamadas, el tiempo de CPU y el uso de memoria de cada función a la que se ha accedido dentro de doSlowOperation() .

xhprof_sample_enable() / xhprof_sample_disable() puede usarse como una opción más liviana que solo registrará la información de perfiles para una fracción de las solicitudes (y en un formato diferente).

XHProf tiene algunas funciones de ayuda (en su mayoría no documentadas) para mostrar los datos ( ver ejemplo ), o puede usar otras herramientas para visualizarlos (el blog platform.sh tiene un ejemplo ).

Uso de memoria

El límite de memoria en tiempo de ejecución de PHP se establece a través de la directiva INI memory_limit . Esta configuración evita que cualquier ejecución individual de PHP consuma demasiada memoria, agotándola para otros scripts y software del sistema. El límite de memoria predeterminado es de 128M y se puede cambiar en el archivo php.ini o en tiempo de ejecución. Puede configurarse para que no tenga límite, pero esto generalmente se considera una mala práctica.

El uso de memoria exacto utilizado durante el tiempo de ejecución se puede determinar llamando a memory_get_usage() . Devuelve el número de bytes de memoria asignados al script actualmente en ejecución. A partir de PHP 5.2, tiene un parámetro booleano opcional para obtener la memoria total del sistema asignada, a diferencia de la memoria que PHP está utilizando activamente.

 <?php
 echo memory_get_usage() . "\n";
 // Outputs 350688 (or similar, depending on system and PHP version)

 // Let's use up some RAM
 $array = array_fill(0, 1000, 'abc');

 echo memory_get_usage() . "\n";
 // Outputs 387704

 // Remove the array from memory
 unset($array);

 echo memory_get_usage() . "\n";
 // Outputs 350784

Ahora memory_get_usage le da uso de memoria en el momento en que se ejecuta. Entre las llamadas a esta función, puede asignar y desasignar otras cosas en la memoria. Para obtener la cantidad máxima de memoria utilizada hasta cierto punto, llame a memory_get_peak_usage() .

<?php
echo memory_get_peak_usage() . "\n";
// 385688
$array = array_fill(0, 1000, 'abc');
echo memory_get_peak_usage() . "\n";
// 422736
unset($array);
echo memory_get_peak_usage() . "\n";
// 422776

Note que el valor solo subirá o se mantendrá constante.

Perfilando con Xdebug

Una extensión de PHP llamada Xdebug está disponible para ayudar en la creación de perfiles de aplicaciones PHP , así como para la depuración en tiempo de ejecución. Cuando se ejecuta el generador de perfiles, la salida se escribe en un archivo en un formato binario llamado "cachegrind". Las aplicaciones están disponibles en cada plataforma para analizar estos archivos.

Para habilitar la creación de perfiles, instale la extensión y ajuste la configuración de php.ini. En nuestro ejemplo, ejecutaremos el perfil opcionalmente en función de un parámetro de solicitud. Esto nos permite mantener la configuración estática y activar el generador de perfiles solo cuando sea necesario.

// Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
// Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
// The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
// Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"

A continuación, use un cliente web para realizar una solicitud a la URL de su aplicación que desea perfilar, por ejemplo,

http://example.com/article/1?XDEBUG_PROFILE=1

A medida que la página se procesa, se escribirá en un archivo con un nombre similar a

/tmp/cachegrind.out.12345

Tenga en cuenta que escribirá un archivo para cada solicitud / proceso de PHP que se ejecute. Por ejemplo, si desea analizar una publicación de formulario, se escribirá un perfil para la solicitud GET para mostrar el formulario HTML. El parámetro XDEBUG_PROFILE deberá pasar a la solicitud POST posterior para analizar la segunda solicitud que procesa el formulario. Por lo tanto, cuando se perfila, a veces es más fácil ejecutar curl para POSTAR un formulario directamente.

Una vez escrito, el caché de perfil puede ser leído por una aplicación como KCachegrind.

KCachegrind

Esto mostrará información que incluye:

  • Funciones ejecutadas
  • Tiempo de llamada, tanto en sí mismo como inclusivo de llamadas de función posteriores
  • Número de veces que se llama a cada función
  • Gráficos de llamadas
  • Enlaces al código fuente

Obviamente, el ajuste del rendimiento es muy específico para los casos de uso de cada aplicación. En general es bueno buscar:

  • Llamadas repetidas a la misma función que no esperaría ver. Para las funciones que procesan y consultan datos, estas podrían ser las principales oportunidades para que su aplicación se almacene en caché.
  • Funciones de ejecución lenta. ¿Dónde está la aplicación pasando la mayor parte de su tiempo? La mejor recompensa en la optimización del rendimiento es centrarse en aquellas partes de la aplicación que consumen más tiempo.

Nota : Xdebug, y en particular sus características de creación de perfiles, son muy intensivos en recursos y ralentizan la ejecución de PHP. Se recomienda no ejecutar estos en un entorno de servidor de producción.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow