Menú
Es gratis
registro
casa  /  Instalacion y configuracion/ Perfiles imaginarios php. Perfilado y depuración de aplicaciones php con xhprof

Perfiles imaginarios php. Perfilado y depuración de aplicaciones php con xhprof

Creación de perfiles de código PHP

Tarde o temprano, cada uno de nosotros se enfrenta al código heredado y su optimización. Depurador y generador de perfiles en tal situación: mejores ayudantes programador. Para aquellos que trabajan con PHP, gracias a Derick Rethans, existe una buena herramienta: xDebug. Hay mucha información sobre xDebug incluso en runet, por lo que este artículo no será sobre eso.

Habiendo tropezado con la mención de un generador de perfiles para PHP, inmediatamente pensé en xDebug (hace mucho que me olvidé de las herramientas propietarias de Zend), pero esta vez me equivoqué: hablaremos de XHProf.
XHProf

Este generador de perfiles fue desarrollado específicamente para Facebook, y fuente fue inaugurado en marzo de 2009.

La instalación fue rápida y sin problemas.
wget pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2 / extensión /
phpize
./configure && make && make install
cd /usr/local/etc/php.d/
vim xhprof.ini
cd / usr / local /
vim header.php
vim footer.php
vim etc / php.ini
/etc/init.d/php-fpm reiniciar
cp vhost.conf.template prof.my.conf
sed -i s / site / prof / prof.my.conf
vim prof.my.conf
/etc/init.d/nginx reiniciar

Analicemos las configuraciones mencionadas

Xhprof.ini
extensión = / usr / local / lib / php / extensions / no-debug-non-zts-20090626 / xhprof.so
xhprof.output_dir = "/ inicio / max / www / profile /"

Prof.my.conf - nginks config - el más estándar.

Servidor (
escucha 80;
nombre_servidor prof.my;
charset utf8;

Raíz /usr/local/src/xhprof-0.9.2/xhprof_html;
ubicación / (
index index.php;
}

Ubicación ~ \ .php $ (
fastcgi_pass 127.0.0.1:12000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/src/xhprof-0.9.2/xhprof_html/$fastcgi_script_name;
incluir fastcgi_params;

/Usr/local/src/xhprof-0.9.2/xhprof_html contiene fuentes PHP que crean una GUI WEB agradable para el generador de perfiles.

Entonces sobre los dos archivos principales:

Header.php


include_once "/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php";
include_once "/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_runs.php";
xhprof_enable (XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
}

Footer.php
if (isset ($ _ COOKIE ["xhprof"])) (
si (extensión_cargada ("xhprof")) (
$ profiler_namespace = "myapp"; // espacio de nombres para su aplicación
$ xhprof_data = xhprof_disable ();
$ xhprof_runs = new XHProfRuns_Default ();
$ run_id = $ xhprof_runs-> save_run ($ xhprof_data, $ profiler_namespace);

// URL a las bibliotecas de interfaz de usuario de XHProf (cambie el nombre de host y la ruta)
$ profiler_url = sprintf ("http://prof.my/index.php?run=%s&source=%s", $ run_id, $ profiler_namespace);
eco<<Salida del perfilador
FUERA;
}
}

Ahora ejecutamos cualquier script PHP a través de la web y vemos en la esquina superior izquierda un enlace a la salida del generador de perfiles; para esto se creó prof.my host.

Tenga en cuenta que estoy usando la verificación para COOKIE. Con esta verificación, puede utilizar de forma segura el generador de perfiles en el servidor de producción, con datos reales y con carga real.

La interfaz web del generador de perfiles muestra etiquetas con información sobre cada función e informa la siguiente información:

  • Número de llamadas a cada función
  • Wall-time, el tiempo dedicado a ejecutar funciones (incluida la espera de respuestas de sockets, sistema de archivos, etc.).
  • Tiempo de CPU, tiempo dedicado a ejecutar funciones (excluida la espera de respuestas de sockets, sistema de archivos, etc.).
  • Uso de memoria
  • Uso máximo de memoria

Es posible ordenar la tabla por cualquiera de los parámetros

La información sobre cada función se divide en dos tipos más Inclusiva y Exclusiva. Inclusive incluye los dígitos utilizados por las llamadas de los niños, mientras que Exclusive no. También es posible, al hacer clic en el nombre de la función, ver información solo sobre ella y las funciones desde las que se llamó y a las que se llamó.

Si GraphViz está instalado en el sistema, el generador de perfiles dibujará un gráfico de llamadas para usted.

PD Sin romper tradiciones: este es mi primer post sobre habr.

UPD: volver a publicar en PHP.

Con la ayuda de los sistemas de creación de perfiles, puede recopilar información sobre qué funciones en el código php consumen más tiempo de procesador y RAM, es decir, identificar los lugares más lentos y con mayor uso de memoria en un programa php.

xhprof

XHProf - Profiler PHP desarrollado por Facebook.

Instalación:

Aptitude install php-pear pecl install xhprof-0.9.4 echo "extension = xhprof.so"> /etc/php5/mods-available/xhprof.ini ln -s /etc/php5/mods-available/xhprof.ini / etc /php5/conf.d/xhprof.ini apachectl reiniciar

Los archivos necesarios para el trabajo se encuentran en el directorio / usr / share / php... Sin embargo, no todos, sino solo con php-code. Requiere jquery y css para mostrar los informes correctamente. Se pueden obtener del repositorio en github:

Clon de Git https://github.com/facebook/xhprof.git

Después de eso, agregue la línea al código php-script en el lugar donde debe comenzar la recopilación de datos:

Xhprof_enable (XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

Los parámetros para la recopilación de datos se indican entre paréntesis. En este caso, se recopilarán datos sobre la carga en el procesador y sobre el uso de RAM. Un parámetro más es posible XHPROF_FLAGS_NO_BUILTINS cuando no se recopilan datos sobre funciones integradas.

$ xhprof_data = xhprof_disable (); include_once "xhprof_lib / utils / xhprof_lib.php"; include_once "xhprof_lib / utils / xhprof_runs.php"; $ xhprof_runs = new XHProfRuns_Default (); $ run_id = $ xhprof_runs-> save_run ($ xhprof_data, "xhprof_test"); echo "Informe: http: //domain.tld/xhprof_html/index.php? run = $ run_id & source = xhprof_test"; echo "\ n";

En línea $ run_id las comillas indican el nombre del perfil, que se puede configurar arbitrariamente.

El resultado procesado se ve así:

Si especifica el parámetro XHPROF_FLAGS_NO_BUILTINS, entonces puede ver que la cantidad de llamadas a funciones se reduce significativamente:

La tabla proporciona la siguiente información:

Llamadas- el número de llamadas a funciones,
Tiempo de pared- el tiempo total de funcionamiento de la función, incluido el tiempo de espera para una respuesta de recursos externos,
UPC- cuánto tiempo se dedicó a procesar funciones,
MemUse- cuánta RAM se utilizó,
PeakMemUse- consumo máximo de memoria.

Los modificadores son:

Incl- inclusive - teniendo en cuenta las llamadas a otras funciones desde esta función,
Excl- exclusivo - excluyendo llamadas a funciones.

Además, la información sobre el tiempo total de procesamiento, la memoria utilizada y el número de llamadas a funciones se presenta encima de la tabla.

también XHProf le permite generar informes diferenciales entre dos ejecuciones, que se indican en rojo y verde. Con estos informes, puede obtener una imagen clara de las mejoras después de cada cambio de código.

Para obtener dicho informe, debe utilizar un enlace del formulario:

http: //domain.tld/xhprof_html/index.php? run1 = run_id1 & run2 = run_id2 & source = xhprof_test

donde run_id1 y run_id2- identificadores de lanzamiento.

Si instala Graphviz:

Aptitude instalar graphviz

También para php profiler xhprof existen interfaces web de terceros que utilizan bases de datos:

xDebug

xDebug es un depurador de código PHP de creación de perfiles escrito por Derick Rethans.

Instalación:

Yum instalar php5-xdebug

Luego editamos la configuración:

Nano /etc/php5/mods-available/xdebug.ini

añadiéndole las líneas:

Xdebug.profiler_enable = 1 xdebug.profiler_aggregate = En xdebug.profiler_output_dir = / tmp

Aquí activamos el generador de perfiles de PHP y especificamos el directorio en el que colocar los perfiles. Los perfiles se crean con nombres como cachegrind.out. *

Hay un cliente web webgrind: https://github.com/jokkedk/webgrind. No funciona muy rápido, pero le permite ver rápidamente perfiles pequeños. De hecho, este es un código PHP que debe clonarse desde github:

Clon de Git https://github.com/jokkedk/webgrind.git

se creará un directorio webgrind, que debe copiar al directorio de cualquier sitio y acceder a él desde el navegador. Además, para que la representación gráfica en el archivo de configuración funcione en Debian config.php necesitas corregir la ruta al archivo ejecutable Graphviz... Debe tener un aspecto como este:

Estático $ dotExecutable = "/ usr / bin / dot";

Además, puede corregir la zona horaria:

Estático $ defaultTimezone = "Europa / Moscú";

En el encabezado, puede seleccionar un perfil y marcar la casilla si se deben tener en cuenta las funciones integradas. En la propia tabla se pueden ver las funciones, el número de llamadas, el tiempo de funcionamiento de la propia función y el tiempo teniendo en cuenta el tiempo de espera. Para profundizar en las funciones, simplemente haga clic en la flecha triangular. En mi caso, con perfiles suficientemente grandes (de varios megabytes), la expectativa del resultado era innecesariamente alta. Probablemente, para perfiles suficientemente grandes, es mejor utilizar programas de visor local.

El gráfico podría verse así:

tenga en cuenta que webgrind no debe usarse en servidores de producción, ya que no se proporciona autorización, pero al mismo tiempo hay acceso al código de los archivos en php. Utilice al menos la autorización básica de Apache si es necesario.

También hay programas para analizar perfiles como en Linux:

Acerca de la elaboración de perfiles

Los datos de perfil pueden ayudarlo a mejorar su aplicación, es decir, lograr ciertos objetivos, por ejemplo, reducir el consumo de memoria, reducir el tiempo de generación de páginas, etc.

La información del perfil es el punto de partida de la optimización: indica cuánto tiempo se genera el resultado, cuánta memoria se utiliza y cuántas llamadas a funciones se realizan. Con datos más detallados, puede mejorar estas métricas.

Por ejemplo, si está utilizando un marco, entonces el uso de algunas de las funciones del marco puede resultar en la llamada de varias funciones básicas. Si está leyendo algunos datos varias veces, puede que valga la pena guardar el resultado en una variable.

Además, el generador de perfiles puede ayudarlo a comprender dónde usar el almacenamiento en caché de PHP, por ejemplo, usando APCu o memcached.

En primer lugar, conviene optimizar las funciones que requieren más tiempo para ejecutarse. Después de que todo está optimizado y parece que no hay nada más que mejorar, vale la pena ordenar las funciones por el número de llamadas y trabajar para bajarlo. Incluso si PHP es rápido, vale la pena considerar si necesita llamar a funciones con tanta frecuencia.

Cuando se encuentra con las siguientes situaciones, vale la pena considerar el almacenamiento en caché:

  • Las funciones inmutables se llaman dentro del ciclo,
  • Algunos contenidos se generan dos veces,
  • El contenido que no cambia se genera cada vez,
  • El contenido se genera incluso si no se utiliza.

No debe almacenar en caché todo, ya que la memoria también es un recurso valioso. Guarde en caché los datos a los que accede constantemente. Además, el almacenamiento en caché tiene poco sentido si el almacenamiento en caché desperdicia más recursos de los que ahorra.

Además de almacenar en caché su código, no se olvide de almacenar en caché utilizando el servidor web (), así como en el lado del cliente. Al usar los encabezados correctos, muchas solicitudes se pueden resolver antes de que lleguen al servidor.

Con el tiempo, cualquier programador PHP se enfrenta al problema del bajo rendimiento de su aplicación. Esto podría deberse a una carga lenta de una página específica o una respuesta demasiado larga de la API. Y a veces es bastante difícil entender cuál es la razón de los frenos. A veces ocurren situaciones más difíciles: en el servidor de producción, la API es muy lenta, pero en el stand donde se está desarrollando, todo está bien. Y averigua qué va mal. La depuración en un servidor de producción es una desesperación extrema que, por supuesto, es mejor no controlar.

Es para estas situaciones que se inventaron herramientas especiales llamadas perfiladores de aplicaciones. En el mundo PHP, este papel lo desempeñan tanto xDebug como xhprof. xhprof es una herramienta más liviana, simple y flexible y, por lo tanto, se prefiere. Curiosamente, xhprof fue desarrollado por Facebook en 2009, sin embargo, todavía no hay soporte oficial para php7 de ellos y ya no lo será desde que Facebook cambió a HHVM. Sin embargo, gracias a la gran comunidad de desarrolladores de php, ha aparecido una bifurcación que admite php7, cuya instalación no causa ninguna dificultad.

Instalación

Primero necesitas instalar xhprof:

Clon de Git https://github.com/longxinH/xhprof xhprof cd xhprof / extensión phpize ./configure --with-php-config = / usr / bin / php-config sudo make && sudo make install mkdir / var / tmp / xhprof

Extensión = xhprof.so xhprof.output_dir = "/ var / tmp / xhprof"

La carpeta / var / tmp / xhprof debe tener acceso de escritura, porque Los resultados de la elaboración de perfiles se guardarán allí.

Puede volver a cargar PHP-FPM y verificar si la extensión está instalada. Es trillado, se puede hacer usando la salida de la función phpinfo ();

xhprof está instalado, puede usarlo. El paquete xhprof incluye una interfaz muy fácil de usar para analizar informes de creación de perfiles. xhprof le permite crear informes, tanto en forma de texto como de forma gráfica. La carpeta de instalación xhprof contiene el xhprof_html y xhprof_lib que necesitamos. Carpeta Xhprof_html: proporciona acceso a la GUI. xhprof_lib es una biblioteca para mostrar y analizar código. Es recomendable mover toda la carpeta xhprof a / var / www / xhprof y configurar un host virtual para ella, por ejemplo xhprof.loc. Ejemplo para nginx:

Servidor (escucha 80; nombre_servidor xhprof.loc; juego de caracteres utf-8; root / var / www / xhprof / xhprof_html; index index.php; ubicación / (try_files $ uri $ uri / /index.php?q=$uri&$args ;) ubicación ~ \ .php (fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^ (. + \. php) (/.+) $; fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name; include fastcgi_params;))

También debe recordar actualizar su archivo de hosts. Ahora, cuando ingresemos la URL xhprof.loc en el navegador, se nos llevará a la interfaz web del generador de perfiles, donde se accederá a los archivos generados por él.

Ahora puede comenzar a crear perfiles de su código directamente.

Para habilitar el generador de perfiles, use la función xhprof_enable (), que toma las siguientes banderas como entrada:

  • XHPROF_FLAGS_CPU: para corregir las estadísticas del procesador;
  • XHPROF_FLAGS_MEMORY - para memoria;
  • XHPROF_FLAGS_NO_BUILTINS - para ignorar las funciones integradas.

Para deshabilitar el generador de perfiles, use la función xhprof_disable (). Para mayor comodidad, escribamos dos scripts header.php y footer.php que realicen estas funciones. header.php se incluye al comienzo del script perfilado y footer.php al final. footer.php también se ocupa de guardar los datos de creación de perfiles.

header.php: if (extension_loaded ("xhprof")) (include_once "/var/www/xhprof/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/xhprof/xhprof_lib/utils/xhpprof_runs.php ( XHPROF_FLAGS_CPU);) footer.php: if (extension_loaded ("xhprof")) ($ profilerNamespace = "PROFILED_SCRIPT_NAME_ HERE"; $ xhprofData = xhprof_shprofRunIsable (); ($ xhprofData, $ profilerNamespace)
Uso

Habiendo conectado header.php y footer.php al script perfilado, puede comenzar: cuando se ejecute el script perfilado, se generará un archivo que se guardará en el directorio / var / tmp / xhprof que contiene información sobre el funcionamiento del script. Cuando abra la interfaz web xhprof.loc, este archivo generado estará disponible:


Cuando abre el archivo de creación de perfiles, aparece información detallada sobre el funcionamiento de la aplicación, toda la pila de llamadas:


Qué significan las columnas:

  • Llamadas- número y porcentaje de llamadas a funciones;
  • Incl. Tiempo de pared- tiempo de ejecución de una función con funciones anidadas;
  • Excl. Tiempo de pared- tiempo de ejecución de una función sin funciones anidadas;
  • Incl. UPC- tiempo de procesador con funciones anidadas;
  • Excl. UPC- tiempo de CPU sin funciones anidadas;
  • Incl. MemUse- consumo de memoria con funciones anidadas;
  • Excl. MemUse- consumo de memoria sin funciones anidadas;
  • Incl. PeakMemUse- consumo máximo de memoria con funciones anidadas;
  • Excl. PeakMemUse- consumo máximo de memoria sin funciones anidadas.

Si sigue el enlace, verá un hermoso árbol de llamadas con una indicación visual del código más inhibido. Si esto no sucedió, lo más probable es que necesite instalar la biblioteca graphviz:

Apto-obtener instalar graphviz

Un ejemplo de un gráfico trazado:

En mi caso, el cuello de botella es la interacción con la base de datos.


Usando xhprof en un servidor de producción

Inicialmente, xhprof se desarrolló específicamente con el propósito de crear perfiles de código en batalla, en servidores de producción. Simplemente no existe otra herramienta gratuita y eficaz para crear perfiles de código php7 en la batalla, por lo que xhprof no tiene competidores. Específicamente, tengo experiencia en el uso de xhprof en un servidor de producción que procesa un millón de solicitudes por día. Utiliza php7 y aún no se han encontrado problemas. Sin embargo, xhprof no se ejecuta para todas las solicitudes; se generarían demasiados archivos de creación de perfiles. Mi generador de perfiles se inicia solo si la solicitud contiene el encabezado "XHPROF_ENABLE" y se establece en verdadero. También puede utilizar otra estrategia, por ejemplo, ejecutar el generador de perfiles de forma aleatoria con una probabilidad de, digamos, 1/1000. Entonces la imagen también será lo suficientemente clara.


Conclusión

Aunque xhprof no es oficialmente compatible con php7, sigue siendo una herramienta indispensable para los desarrolladores de php.

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

Para habilitar la creación de perfiles, instale la extensión y ajuste la configuración de php.ini. Algunas distribuciones de Linux vienen con paquetes estándar (por ejemplo, el paquete php-xdebug de Ubuntu). 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.

# configuración de php.ini # Establecer en 1 para activarlo para cada solicitud xdebug.profiler_enable = 0 # Usemos un parámetro GET / POST para activar el generador de perfiles xdebug.profiler_enable_trigger = 1 # El valor GET / POST que pasaremos ; vacío para cualquier valor xdebug.profiler_enable_trigger_value = "" # Archivos cachegrind de salida a / tmp para que nuestro sistema los limpie más tarde xdebug.profiler_output_dir = "/ tmp" xdebug.profiler_output_name = "cachegrind.out.% p"

A continuación, utilice un cliente web para realizar una solicitud a la URL de su aplicación que desea perfilar, p. Ej.

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

Por defecto, el número en el nombre del archivo es la identificación del proceso que lo escribió. Esto se puede configurar con la configuración xdebug.profiler_output_name.

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

Analizando la salida

Una vez escrito, el caché del perfil puede ser leído por una aplicación como Webgrind. PHPStorm, un popular IDE de PHP, también puede mostrar estos datos de perfil.

KCachegrind, por ejemplo, mostrará información que incluye:

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

Qué buscar

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 almacene en caché.
  • Funciones de ejecución lenta. ¿Dónde pasa la aplicación la mayor parte de su tiempo? La mejor recompensa en el ajuste del rendimiento es centrarse en las partes de la aplicación que consumen más tiempo.

Nota: Xdebug, y en particular sus funciones de creación de perfiles, consumen muchos recursos y ralentizan la ejecución de PHP. Se recomienda no ejecutarlos en un entorno de servidor de producción.

FirePHP es una extensión para firebug, que, junto con su pequeña clase php, le permite transmitir datos desde php, por ejemplo var_dump y otra información de depuración, a los encabezados de la consola firebug y no ensucia las páginas y no rompe el lógica de la aplicación en cualquier forma. Sitio oficial: http://firephp.org/.

Idea principal.

El algoritmo general de generación de perfiles es el siguiente:
  1. Al principio de la página, habilite la creación de perfiles usando xhprof_enable ()
  2. Al final de la página, desactive la creación de perfiles usando xhprof_disable () y guarde los datos recopilados usando save_run ()
  3. A continuación, utilizando la clase php firephp, transferimos el enlace a los datos de creación de perfiles al lado del cliente.
  4. En la consola de Firebug "y abre la información que necesitamos
  5. Estamos felices :)
También me gustaría decir que, por supuesto, agregar manualmente estas funciones a sus scripts php es genial. Pero quiero que esta información esté siempre a mano durante el desarrollo y, al mismo tiempo, no llegue a los servidores de combate. Resolvemos este problema de la siguiente manera:

En nuestros proyectos, en casi todos los scripts, al principio se conecta un archivo de trabajo con un cargador de clases, funciones de conexión y otras cosas necesarias. Por lo tanto, trasladamos la inclusión de la creación de perfiles a este archivo. Y para poder activar / desactivar el modo de depuración a voluntad, agregamos una verificación para una constante de configuración, además de envolver estas verificaciones en algunas metaetiquetas que se eliminan automáticamente al construir el proyecto. Lo mismo se aplica a la desactivación de la creación de perfiles y la escritura de información en los encabezados utilizando firephp: estas tareas se resuelven mediante una función que se llama al final de cada script php y también se incluye en metaetiquetas. Se parece a esto:

// Estas constantes están escritas en el archivo de configuración de la aplicación

/ ** Modo de funcionamiento ambiental * * /
define ("APPLICATION_ENV", "dev"); // dev - depuración | pro - producción
/ ** Ruta al generador de perfiles * /
define ("XHPROF_ROOT", __DIR__. "/ExtProcs/debug/xhprof-0.9.2");

/***************************************************************************************
* A continuación, en el archivo que se carga al principio de cada script, ejecutamos el perfil
* DEV_START y DEV_END son nuestras metaetiquetas, todo lo que hay entre ellas se corta durante el montaje
***************************************************************************************/

// - DEV_START
// - en modo de depuración, conecta las bibliotecas de depuración

// Cargar firephp
require_once (__ DIR__. "/includes/ExtProcs/debug/firephp/FirePHP.class.php");
// - cargar el generador de perfiles
"/xhprof_lib/utils/xhprof_lib.php");
require_once (XHPROF_ROOT. "/xhprof_lib/utils/xhprof_runs.php");
// Inicializar la creación de perfiles con los indicadores necesarios. Descripción detallada de banderas
// se puede encontrar en php.net/manual/ru/xhprof.constants.php
xhprof_enable (XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
// - DEV_END

// Bueno, esta función se llama al final de cada script
// Su llamada también está envuelta en DEV_START y DEV_END

/**
* Cree un enlace al resultado del perfil y envíelo a la consola
*/
función dev_boot_Down () (
si (APPLICATION_ENV === "dev") (
// Inicializa la instancia de firephp
$ firephp = FirePHP :: getInstance (verdadero);
// Desactive la creación de perfiles y guarde los datos
$ xhprof_data = xhprof_disable ();
$ xhprof_runs = new XHProfRuns_Default ();
$ run_id = $ xhprof_runs-> save_run ($ xhprof_data, "xhprof_testing");
// Forme un enlace a los datos del perfil y escríbalo en la consola
$ enlace = "http: //". $ _SERVER ["HTTP_HOST"]. "/includes/ExtProcs/debug/xhprof-0.9.2/xhprof_html/index.php?run=($run_id)&source=xhprof_testing\n";
$ firephp-> info ($ enlace, "datos de perfil");
}
}


* Este código fuente se resaltó con el resaltador de código fuente.

No entraré en detalles sobre la instalación de estas extensiones, porque aquí todo es simple. Solo diré sobre algunos de los puntos de configuración. Xhproof proporciona solo una variable de configuración, xhprof.output_dir, que apunta a la carpeta donde se guardarán los datos del perfil. Por lo tanto, asegúrese de que el usuario bajo el cual se ejecutan los scripts php tenga permisos de escritura en el directorio especificado. Así que ponga algo como esto en su php.ini:


extensión = xhprof.so
xhprof.output_dir = "/ var / tmp / xhprof"

Tampoco está mal poner algo como un punto o Graphviz para dibujar gráficos de llamadas. Tengo Graphviz en MacOS X.

Después de completar los procedimientos anteriores, pudimos abrir y ver el perfil de cualquiera de nuestros scripts directamente en el navegador en cualquier momento.