Una interfaz gráfica para datos de creación de perfiles XHProf que puede almacenar los resultados en una base de datos MongoDB o PDO.
Se crea el perfil de la aplicación y los datos del perfil se transfieren a XHGui, que toma esa información, la guarda en MongoDB (o base de datos PDO) y proporciona una GUI conveniente para trabajar con ella.
Este proyecto es la GUI para mostrar los resultados de la creación de perfiles. Para crear perfiles de su aplicación, utilice una biblioteca mínima específica:
XHGui tiene los siguientes requisitos:
Si necesita decidir qué backend usar, puede consultar en la matriz de compatibilidad qué funciones están implementadas o faltan por backend.
La instalación predeterminada utiliza la base de datos MongoDB. La mayor parte de la documentación habla de MongoDB.
pecl install mongodb
XHGui requiere la versión 1.3.0 o posterior.Cualquiera de los controladores y una base de datos adjunta:
NOTA: Es posible que PDO no admita todas las funciones de XHGui, consulte el n.º 320.
Clona o descarga xhgui
desde GitHub.
Apunte su servidor web al directorio webroot
.
Configure los permisos en el directorio cache
para permitir que el servidor web cree archivos. Si eres vago, 0777
funcionará.
El siguiente comando cambia los permisos para el directorio cache
:
chmod -R 0777 cache
Inicie una instancia de MongoDB. XHGui utiliza la instancia de MongoDB para almacenar datos de perfiles.
Si su configuración de MongoDB usa autenticación o no se ejecuta en el puerto predeterminado y el host local, actualice config/config.php
de XHGui para que XHGui pueda conectarse a su instancia mongod
.
( Opcional , pero recomendado) Agregue índices a MongoDB para mejorar el rendimiento.
XHGui almacena información de perfiles en una colección results
en la base de datos xhprof
en MongoDB. Agregar índices mejora el rendimiento y le permite navegar por las páginas más rápidamente.
Para agregar un índice, abra un shell mongo
desde el símbolo del sistema. Luego, use el método db.collection.ensureIndex()
de MongoDB para agregar los índices, como se muestra a continuación:
$ mongo
> use xhprof
> db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
> db.results.ensureIndex( { 'profile.main().wt' : -1 } )
> db.results.ensureIndex( { 'profile.main().mu' : -1 } )
> db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
> db.results.ensureIndex( { 'meta.url' : 1 } )
> db.results.ensureIndex( { 'meta.simple_url' : 1 } )
> db.results.ensureIndex( { 'meta.SERVER.SERVER_NAME' : 1 } )
Instalar dependencias con Composer.
composer install --no-dev
Configure su servidor web. La siguiente sección de Configuración describe cómo configurar las reglas de reescritura tanto para nginx como para apache.
Esta configuración utiliza docker-compose para organizar los contenedores de Docker.
Clona o descarga xhgui
desde GitHub.
Inicie los contenedores: docker-compose up -d
Abra su navegador en http://xhgui.127.0.0.1.xip.io:8142 o simplemente http://localhost:8142 o escriba en la terminal composer open
Para personalizar xhgui, copie config/config.default.php
a config/config.php
y edite ese archivo.
Para personalizar docker-compose, copie docker-compose.yml
a docker-compose.override.yml
y edite ese archivo.
XHGui prefiere tener habilitada la reescritura de URL, pero funcionará sin ella. Para Apache, puede hacer lo siguiente para habilitar la reescritura de URL:
Asegúrese de que se permita una anulación de .htaccess y que AllowOverride tenga la directiva FileInfo configurada para el DocumentRoot correcto.
Configuración de ejemplo para Apache 2.4:
< Directory /var/www/xhgui/>
Options Indexes FollowSymLinks
AllowOverride FileInfo
Require all granted
</ Directory >
Asegúrate de estar cargando mod_rewrite correctamente. Deberías ver algo como:
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
XHGui viene con un archivo .htaccess
para habilitar las reglas de reescritura restantes.
Para nginx y fast-cgi, puede utilizar el siguiente fragmento como comienzo:
server {
listen 80 ;
server_name example.com;
# root directive should be global
root /var/www/example.com/public/xhgui/webroot/;
index index.php;
location / {
try_files $uri $uri / /index.php? $args ;
}
location ~ .php$ {
try_files $uri =404 ;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name ;
}
}
La forma admitida de generar perfiles de una aplicación es utilizar el paquete perftools/php-profiler.
Puede utilizar ese paquete para recopilar datos de su aplicación web o un script CLI.
Luego, estos datos se envían a la base de datos XHGui, donde se pueden ver con la aplicación XHGui.
El paquete php-profiler
ofrece el envío de datos directamente a la instancia XHGui una vez que se completa la creación de perfiles al final de la solicitud.
Si la aplicación no puede conectarse directamente a la instancia XHGui, el paquete ofrece una solución para capturar datos de perfiles en un archivo que puede importar más tarde utilizando el script de importación.
Advertencia : importar el mismo archivo dos veces creará perfiles duplicados.
El uso del disco puede crecer rápidamente, especialmente cuando se crean perfiles de aplicaciones con bases de código grandes o que utilizan marcos más grandes.
Para mantener el crecimiento bajo control, configure MongoDB para que elimine automáticamente los documentos de perfiles una vez que hayan alcanzado cierta antigüedad mediante la creación de un índice TTL.
Decida la antigüedad máxima del documento de perfil en segundos: es posible que desee elegir un valor más bajo en desarrollo (donde perfila todo) que en producción (donde perfila solo una selección de documentos). El siguiente comando le indica a Mongo que elimine documentos que tengan más de 5 días (432000 segundos).
$ mongo
> use xhprof
> db.results.ensureIndex( { "meta.request_ts" : 1 }, { expireAfterSeconds : 432000 } )
El objetivo de la visualización en cascada de XHGui es reconocer que las solicitudes simultáneas pueden afectarse entre sí. Las solicitudes simultáneas de bases de datos, las actividades que consumen mucha CPU e incluso los bloqueos de archivos de sesión pueden volverse relevantes. Con una aplicación con mucho Ajax, comprender la creación de la página es mucho más complejo que una sola carga: con suerte, la cascada puede ayudar. Recuerde, si solo está perfilando una muestra de solicitudes, la cascada lo llenará de mentiras descorteses.
Algunas notas:
request_ts_micro
, ya que la granularidad de segundo nivel no funciona bien con las cascadas. Las métricas de Prometheus adecuadas para monitorear el estado del servicio están expuestas en /metrics
. (Esto actualmente solo funciona si se usa PDO para almacenamiento).
Característica | MongoDB | DOP |
---|---|---|
Exportador de Prometeo | #305 | |
Buscador::último() | ||
Buscador::consulta() | #384 | |
Buscador::obtener() | ||
Buscador::getForUrl() | #436 | |
Buscador::getPercentileForUrl() | #436 | |
Buscador::getAvgsForUrl() | #384 | |
Buscador::getAll(ordenar) | #436 | |
Buscador::getAll(dirección) | #436 | |
Buscador::eliminar() | ||
Buscador::truncar() | ||
Buscador::saveWatch() | #435 | |
Buscador::getAllWatches() | #435 | |
Buscador::truncateWatches() | #435 | |
Buscador::estadísticas() | #305 | |
Buscador::getAllServerNames() | #460 |
Consulte las versiones para conocer los registros de cambios y la información de las versiones.
Copyright (c) 2013 Mark Story y Paul Reinheimer
Por el presente se otorga permiso, sin cargo, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para operar con el Software sin restricciones, incluidos, entre otros, los derechos de uso, copia, modificación, fusión. , publicar, distribuir, sublicenciar y/o vender copias del Software, y permitir que las personas a quienes se les proporciona el Software lo hagan, sujeto a las siguientes condiciones:
El aviso de derechos de autor anterior y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES DE NINGÚN RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, AGRAVIO O DE OTRA MANERA, QUE SURJA DE, FUERA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIOS EN EL SOFTWARE.