Uma interface gráfica para dados de criação de perfil XHProf que pode armazenar os resultados no banco de dados MongoDB ou PDO.
O perfil do aplicativo é criado e os dados do perfil são transferidos para o XHGui, que pega essas informações, salva-as no MongoDB (ou banco de dados PDO) e fornece uma GUI conveniente para trabalhar com elas.
Este projeto é a GUI para mostrar os resultados do perfil. Para criar o perfil do seu aplicativo, use uma biblioteca mínima específica:
XHGui tem os seguintes requisitos:
Se precisar decidir qual back-end usar, você pode verificar na matriz de compatibilidade quais recursos estão implementados ou ausentes por back-end.
A instalação padrão usa o banco de dados MongoDB. A maior parte da documentação fala sobre o MongoDB.
pecl install mongodb
XHGui requer versão 1.3.0 ou posterior.Qualquer um dos drivers e um banco de dados que o acompanha:
NOTA: O PDO pode não suportar todos os recursos do XHGui, consulte #320.
Clone ou baixe xhgui
do GitHub.
Aponte seu servidor web para o diretório webroot
.
Defina as permissões no diretório cache
para permitir que o servidor web crie arquivos. Se você for preguiçoso, 0777
funcionará.
O comando a seguir altera as permissões do diretório cache
:
chmod -R 0777 cache
Inicie uma instância do MongoDB. XHGui usa a instância MongoDB para armazenar dados de criação de perfil.
Se a sua configuração do MongoDB usa autenticação ou não está sendo executada na porta padrão e no host local, atualize config/config.php
do XHGui para que o XHGui possa se conectar à sua instância mongod
.
( Opcional , mas recomendado) Adicione índices ao MongoDB para melhorar o desempenho.
O XHGui armazena informações de perfil em uma coleção de results
no banco de dados xhprof
no MongoDB. Adicionar índices melhora o desempenho, permitindo navegar pelas páginas mais rapidamente.
Para adicionar um índice, abra um shell mongo
no prompt de comando. Em seguida, use o método db.collection.ensureIndex()
do MongoDB para adicionar os índices, como a seguir:
$ 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 } )
Instale dependências com o compositor
composer install --no-dev
Configure seu servidor web. A seção Configuração abaixo descreve como configurar as regras de reescrita para nginx e apache.
Esta configuração usa docker-compose para orquestrar contêineres do docker.
Clone ou baixe xhgui
do GitHub.
Inicialize os contêineres: docker-compose up -d
Abra seu navegador em http://xhgui.127.0.0.1.xip.io:8142 ou apenas http://localhost:8142 ou digite no terminal composer open
Para personalizar o xhgui, copie config/config.default.php
para config/config.php
e edite esse arquivo.
Para personalizar o docker-compose, copie docker-compose.yml
para docker-compose.override.yml
e edite esse arquivo.
XHGui prefere ter a reescrita de URL habilitada, mas funcionará sem ela. Para o Apache, você pode fazer o seguinte para ativar a reescrita de URL:
Certifique-se de que uma substituição .htaccess seja permitida e que AllowOverride tenha a diretiva FileInfo definida para o DocumentRoot correto.
Exemplo de configuração para Apache 2.4:
< Directory /var/www/xhgui/>
Options Indexes FollowSymLinks
AllowOverride FileInfo
Require all granted
</ Directory >
Certifique-se de carregar o mod_rewrite corretamente. Você deverá ver algo como:
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
XHGui vem com um arquivo .htaccess
para habilitar as regras de reescrita restantes.
Para nginx e fast-cgi, você pode usar o seguinte snippet para começar:
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 ;
}
}
A maneira suportada de criar o perfil de um aplicativo é usar o pacote perftools/php-profiler.
Você pode usar esse pacote para coletar dados de seu aplicativo Web ou de um script CLI.
Esses dados são então enviados para o banco de dados XHGui, onde podem ser visualizados com o aplicativo XHGui.
O pacote php-profiler
oferece o envio de dados diretamente para a instância XHGui assim que o perfil for concluído no final da solicitação.
Se o aplicativo não puder se conectar diretamente à instância XHGui, o pacote oferece solução para capturar dados de perfil em um arquivo que você pode importar posteriormente usando o script de importação.
Aviso : Importar o mesmo arquivo duas vezes criará perfis duplicados.
O uso do disco pode aumentar rapidamente, especialmente ao criar perfis de aplicativos com grandes bases de código ou que usam estruturas maiores.
Para manter o crescimento sob controle, configure o MongoDB para excluir automaticamente documentos de criação de perfil quando eles atingirem uma determinada idade, criando um índice TTL.
Decida a idade máxima do documento de perfil em segundos: você pode escolher um valor mais baixo em desenvolvimento (onde você cria o perfil de tudo) do que em produção (onde você cria o perfil apenas de uma seleção de documentos). O comando a seguir instrui o Mongo a excluir documentos com mais de 5 dias (432.000 segundos).
$ mongo
> use xhprof
> db.results.ensureIndex( { "meta.request_ts" : 1 }, { expireAfterSeconds : 432000 } )
O objetivo da exibição em cascata do XHGui é reconhecer que solicitações simultâneas podem afetar umas às outras. Solicitações simultâneas de banco de dados, atividades com uso intensivo de CPU e até mesmo bloqueios em arquivos de sessão podem se tornar relevantes. Com um aplicativo pesado em Ajax, entender a construção da página é muito mais complexo do que um único carregamento: esperamos que a cascata possa ajudar. Lembre-se, se você estiver traçando o perfil apenas de uma amostra de solicitações, a cachoeira o encherá de mentiras indelicadas.
Algumas notas:
request_ts_micro
, pois a granularidade de segundo nível não funciona bem com cascatas. As métricas do Prometheus adequadas para monitorar a integridade do serviço são expostas em /metrics
. (Atualmente, isso só funciona se estiver usando PDO para armazenamento.)
Recurso | MongoDB | DOP |
---|---|---|
Exportador Prometheus | #305 | |
Pesquisador::mais recente() | ||
Pesquisador::query() | #384 | |
Pesquisador::get() | ||
Pesquisador::getForUrl() | #436 | |
Pesquisador::getPercentileForUrl() | #436 | |
Pesquisador::getAvgsForUrl() | #384 | |
Pesquisador::getAll(classificar) | #436 | |
Pesquisador::getAll(direção) | #436 | |
Pesquisador::delete() | ||
Pesquisador::truncar() | ||
Pesquisador::saveWatch() | #435 | |
Pesquisador::getAllWatches() | #435 | |
Pesquisador::truncateWatches() | #435 | |
Pesquisador::estatísticas() | #305 | |
Pesquisador::getAllServerNames() | #460 |
Veja os lançamentos para changelogs e informações de lançamento.
Copyright (c) 2013 Mark Story e Paul Reinheimer
É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para negociar o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar , publicar, distribuir, sublicenciar e/ou vender cópias do Software e permitir que as pessoas a quem o Software seja fornecido o façam, sujeito às seguintes condições:
O aviso de direitos autorais acima e este aviso de permissão serão incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM HIPÓTESE ALGUMA OS AUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.