¿Cuál es la forma más fácil de perfilar un script PHP?
Me encantaría agregar algo que me muestre un volcado de todas las llamadas a funciones y cuánto tiempo tomaron, pero también estoy de acuerdo con poner algo alrededor de funciones específicas.
Intenté experimentar con la función microtime :
$then = microtime();
myFunc();
$now = microtime();
echo sprintf("Elapsed: %f", $now-$then);
pero eso a veces me da resultados negativos. Además, es muy problemático esparcirlo por todo mi código.
microtime()
dará lugar a expresiones que evalúan a veces como:"0.00154800 1342892546" - "0.99905700 1342892545"
que evaluará como:0.001548 - 0.999057
. Puede usarmicrotime( TRUE )
para evitar ese problema, como lo señaló @luka.Respuestas:
La extensión PECL APD se utiliza de la siguiente manera:
Después, analiza el archivo generado usando
pprofp
.Salida de ejemplo:
Advertencia: la última versión de APD tiene fecha de 2004, la extensión ya no se mantiene y tiene varios problemas de compatibilidad (ver comentarios).
fuente
pecl install apd
, aparece un mensaje de error sobre "config.m4". Parece que tienes que instalarlo desde el código fuente, que aún no he probado. En serio, ¿no existe una herramienta moderna y actualizada de creación de perfiles basada en CLI para PHP que se instale con Homebrew, requiera una configuración mínima y proporcione resultados fácilmente legibles para los humanos?Quieres xdebug , creo. Instálelo en el servidor, enciéndalo, bombee la salida a través de kcachegrind (para Linux) o wincachegrind (para Windows) y le mostrará algunos gráficos bonitos que detallan los tiempos exactos, los recuentos y el uso de la memoria (pero Necesito otra extensión para eso).
Se mece, en serio: D
fuente
No se necesitan extensiones, solo use estas dos funciones para crear perfiles simples.
Aquí hay un ejemplo, llamando a prof_flag () con una descripción en cada punto de control, y prof_print () al final:
La salida se ve así:
Iniciar
0.004303
Conectarse a DB
0.003518
Realizar consulta
0.000308
Recuperar datos
0.000009
Cerrar DB
0.000049
Listo
fuente
Publicación cruzada de mi referencia de SO Documentation beta que se desconecta.
Perfilado con XDebug
Una extensión para PHP llamada Xdebug está disponible para ayudar a perfilar aplicaciones PHP , así como a la depuración en tiempo de ejecución. Al ejecutar 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 se necesitan cambios en el código de la aplicación para realizar este perfil.
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
php-xdebug
paquete 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.A continuación, use un cliente web para realizar una solicitud a la URL de su aplicación que desea perfilar, p. Ej.
A medida que la página se procesa, escribirá en un archivo con un nombre similar a
Por defecto, el número en el nombre del archivo es la identificación del proceso que lo escribió. Esto es configurable con la
xdebug.profiler_output_name
configuración.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 la solicitud GET para mostrar 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 KCachegrind o Webgrind . PHPStorm, un popular IDE de PHP, también puede mostrar estos datos de perfil .
KCachegrind, por ejemplo, mostrará información que incluye:
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:
Nota : Xdebug, y en particular sus características de creación de perfiles, requieren muchos recursos y ralentizan la ejecución de PHP. Se recomienda no ejecutarlos en un entorno de servidor de producción.
fuente
Si restar microtimes le da resultados negativos, intente usar la función con el argumento
true
(microtime(true)
). Contrue
, la función devuelve un flotante en lugar de una cadena (como lo hace si se llama sin argumentos).fuente
Honestamente, voy a argumentar que usar NewRelic para perfilar es lo mejor.
Es una extensión PHP que no parece ralentizar el tiempo de ejecución y hacen el monitoreo por usted, lo que permite un desglose decente. En la versión cara, permiten un gran desglose (pero no podemos permitirnos su modelo de precios).
Aún así, incluso con el plan gratuito / estándar, es obvio y simple dónde se encuentra la mayor parte de la fruta. También me gusta que puede darte una idea sobre las interacciones de DB también.
fuente
Perfil del pobre hombre, no se requieren extensiones. Admite perfiles anidados y porcentaje del total:
Ejemplo:
Rendimientos:
fuente
PECL XHPROF también parece interesante. Tiene una interfaz HTML en la que se puede hacer clic para ver informes y documentación bastante sencilla . Sin embargo, todavía tengo que probarlo.
fuente
Me gusta usar phpDebug para perfilar. http://phpdebug.sourceforge.net/www/index.html
Produce todo el uso de tiempo / memoria para cualquier SQL utilizado, así como todos los archivos incluidos. Obviamente, funciona mejor en código que se abstrae.
Para el perfil de funciones y clases solo usaré
microtime()
+get_memory_usage()
+get_peak_memory_usage()
.fuente
Definitivamente le daría una oportunidad a BlackFire .
Existe este virtualBox que he creado usando puphpet , para probar diferentes marcos de trabajo php que vienen con BlackFire, no dude en bifurcar y / o distribuir si es necesario :)
https://github.com/webit4me/PHPFrameworks
fuente
Para la evaluación comparativa, como en su ejemplo, utilizo el paquete de referencia de pera . Estableces marcadores para medir. La clase también proporciona algunos asistentes de presentación, o puede procesar los datos como mejor le parezca.
De hecho, lo tengo envuelto en otra clase con un método __destruct. Cuando sale un script, la salida se registra a través de log4php en syslog, por lo que tengo muchos datos de rendimiento para trabajar.
fuente
XDebug no es estable y no siempre está disponible para una versión particular de php. Por ejemplo, en algunos servidores todavía ejecuto php-5.1.6, es lo que viene con RedHat RHEL5 (y por cierto aún recibe actualizaciones para todos los problemas importantes), y el reciente XDebug ni siquiera compila con este php. Así que terminé cambiando al depurador DBG. Su evaluación comparativa php proporciona el tiempo para funciones, métodos, módulos e incluso líneas.
fuente
Todos ustedes definitivamente deberían revisar este nuevo perfilador de php.
https://github.com/NoiseByNorthwest/php-spx
Redefine la forma en que php profilers recopila y presenta el resultado. En lugar de generar solo un número total de llamadas a funciones particulares y el tiempo total empleado en ejecutarlo, PHP-SPX presenta toda la línea de tiempo de ejecución de la solicitud de una manera perfectamente legible. A continuación se muestra la pantalla de GUI que proporciona.
fuente