Qual é a maneira mais fácil de criar um perfil de script PHP?
Eu adoraria colocar algo que me mostre um despejo de todas as chamadas de função e quanto tempo elas levaram, mas também estou bem em colocar algo em torno de funções específicas.
Eu tentei experimentar a função microtime :
$then = microtime();
myFunc();
$now = microtime();
echo sprintf("Elapsed: %f", $now-$then);
mas isso às vezes me dá resultados negativos. Além disso, é muito problemático espalhar isso por todo o meu código.
microtime()
vai levar a expressões às vezes avaliando como:"0.00154800 1342892546" - "0.99905700 1342892545"
, que irá avaliar como:0.001548 - 0.999057
. Você pode usarmicrotime( TRUE )
para evitar esse problema, como apontado por @luka.Respostas:
A extensão PECL APD é usada da seguinte maneira:
Depois, analise o arquivo gerado usando
pprofp
.Exemplo de saída:
Aviso: a versão mais recente do APD é datada de 2004, a extensão não é mais mantida e tem vários problemas de compatibilidade (consulte os comentários).
fonte
pecl install apd
, ele fornece uma mensagem de erro sobre "config.m4". Parece que você precisa instalá-lo da fonte, o que eu ainda não tentei. Sério, não existe uma ferramenta moderna e atualizada de criação de perfil baseada em CLI para PHP que é instalada com o Homebrew, requer configuração mínima e fornece saída facilmente legível por humanos?Você quer xdebug, eu acho. Instale-o no servidor, ligue-o, bombeie a saída pelo kcachegrind (para linux) ou wincachegrind (para windows) e ele mostrará alguns gráficos bonitos que detalham os horários exatos, contagens e uso de memória (mas você precisa de outra extensão para isso).
É demais, sério: D
fonte
Não são necessárias extensões, basta usar essas duas funções para criar um perfil simples.
Aqui está um exemplo, chamando prof_flag () com uma descrição em cada ponto de verificação e prof_print () no final:
A saída fica assim:
Iniciar
0.004303
Conectar ao DB
0.003518
Executar consulta
0.000308
Recuperar dados
0.000009
Fechar DB
0.000049
Concluído
fonte
Postando minha referência na SO Documentation beta, que está ficando offline.
Criação de perfil com o XDebug
Uma extensão para PHP chamada Xdebug está disponível para auxiliar na criação de perfil de aplicativos PHP , bem como na depuração em tempo de execução. Ao executar o criador de perfil, a saída é gravada em um arquivo em um formato binário chamado "cachegrind". Os aplicativos estão disponíveis em cada plataforma para analisar esses arquivos. Nenhuma alteração no código do aplicativo é necessária para executar essa criação de perfil.
Para habilitar a criação de perfil, instale a extensão e ajuste as configurações do php.ini. Algumas distribuições Linux vêm com pacotes padrão (por exemplo,
php-xdebug
pacote do Ubuntu ). Em nosso exemplo, executaremos o perfil opcionalmente com base em um parâmetro de solicitação. Isso nos permite manter as configurações estáticas e ativar o criador de perfil apenas conforme necessário.Em seguida, use um cliente da Web para fazer uma solicitação ao URL do seu aplicativo que você deseja criar um perfil, por exemplo,
À medida que a página é processada, ela será gravada em um arquivo com um nome semelhante a
Por padrão, o número no nome do arquivo é a identificação do processo que o escreveu. Isso é configurável com a
xdebug.profiler_output_name
configuração.Observe que ele gravará um arquivo para cada solicitação / processo PHP executado. Portanto, por exemplo, se você deseja analisar uma postagem de formulário, um perfil será gravado para a solicitação GET exibir o formulário HTML. O parâmetro XDEBUG_PROFILE precisará ser passado para a solicitação POST subsequente para analisar a segunda solicitação que processa o formulário. Portanto, ao criar um perfil, às vezes é mais fácil executar curl para postar um formulário diretamente.
Analisando a saída
Depois de gravado, o cache do perfil pode ser lido por um aplicativo como o KCachegrind ou o Webgrind . O PHPStorm, um popular IDE do PHP, também pode exibir esses dados de criação de perfil .
O KCachegrind, por exemplo, exibirá informações, incluindo:
O que procurar
Obviamente, o ajuste de desempenho é muito específico para os casos de uso de cada aplicativo. Em geral, é bom procurar:
Nota : O Xdebug, e em particular seus recursos de criação de perfil, consomem muitos recursos e diminuem a execução do PHP. É recomendável não executá-los em um ambiente de servidor de produção.
fonte
Se subtrair microtimes fornecer resultados negativos, tente usar a função com o argumento
true
(microtime(true)
). Comtrue
, a função retorna um float em vez de uma string (como acontece se for chamada sem argumentos).fonte
Honestamente, vou argumentar que o uso do NewRelic para criação de perfil é o melhor.
É uma extensão PHP que parece não diminuir o tempo de execução e eles fazem o monitoramento para você, permitindo uma pesquisa decente. Na versão cara, eles permitem drill down pesado (mas não podemos pagar pelo modelo de preços).
Mesmo assim, mesmo com o plano gratuito / padrão, é óbvio e simples onde está a maioria das frutas baixas. Eu também gosto que ele também pode dar uma idéia sobre as interações com o banco de dados.
fonte
Perfil do pobre homem, sem extensões necessárias. Suporta perfis aninhados e porcentagem do total:
Exemplo:
Rendimentos:
fonte
O PECL XHPROF também parece interessante. Possui interface HTML clicável para visualizar relatórios e documentação bastante direta . Ainda tenho que testá-lo.
fonte
Eu gosto de usar o phpDebug para criação de perfil. http://phpdebug.sourceforge.net/www/index.html
Ele gera todo o uso de tempo / memória para qualquer SQL usado, bem como para todos os arquivos incluídos. Obviamente, ele funciona melhor em códigos abstraídos.
Para perfis de função e classe, usarei
microtime()
+get_memory_usage()
+get_peak_memory_usage()
.fonte
Eu desafiadoramente daria uma chance ao BlackFire .
Existe essa virtualBox que montei usando puphpet , para testar diferentes estruturas php que vêm com o BlackFire, fique à vontade para bifurcar e / ou distribuir, se necessário :)
https://github.com/webit4me/PHPFrameworks
fonte
Para benchmarking, como no seu exemplo, eu uso o pacote Pear Benchmark . Você define marcadores para medição. A classe também fornece alguns auxiliares de apresentação ou você pode processar os dados como achar melhor.
Na verdade, eu o envolvi em outra classe com um método __destruct. Quando um script sai, a saída é registrada via log4php no syslog; portanto, tenho muitos dados de desempenho para trabalhar.
fonte
O XDebug não é estável e nem sempre está disponível para uma determinada versão do php. Por exemplo, em alguns servidores, eu continuo executando o php-5.1.6, - é o que vem com o RedHat RHEL5 (e o btw ainda recebe atualizações para todas as questões importantes), e o XDebug recente nem compila com este php. Então, acabei mudando para o depurador DBG. O benchmarking php fornece tempo para funções, métodos, módulos e até linhas.
fonte
Vocês todos deveriam definitivamente conferir este novo perfil de php.
https://github.com/NoiseByNorthwest/php-spx
Redefine a maneira como os criadores de perfil php coletam e apresentam o resultado. Em vez de emitir apenas um número total de chamadas de função específicas e o tempo total gasto para executá-lo - o PHP-SPX apresenta toda a linha do tempo da execução de solicitações de uma maneira perfeitamente legível. Abaixo está a tela da GUI que ela fornece.
fonte