Qual é uma boa maneira de traçar o perfil do uso de memória de uma página PHP? Por exemplo, para ver quanta memória meus dados estão usando e / ou quais chamadas de função estão alocando mais memória.
xdebug não parece fornecer informações de memória em seu recurso de criação de perfil.
xdebug faz fornecê-la em seu recurso de rastreamento. Isso é muito próximo do que eu quero, exceto que a grande quantidade de dados é opressora, pois mostra deltas de memória para cada chamada de função. Se fosse possível ocultar chamadas abaixo de uma certa profundidade, talvez com alguma ferramenta GUI, isso resolveria meu problema.
Mais alguma coisa?
Respostas:
O Xdebug reimplementou o rastreamento de memória no 2.6 (2018-01-29) que pode ser usado no Qcachegrind ou ferramenta semelhante. Apenas certifique-se de selecionar a opção de memória :)
Dos documentos:
Não estou familiarizado com o formato do arquivo, mas seu Qcachegrind funcionou muito bem para mim no rastreamento de alguns problemas de memória.
fonte
Como você provavelmente sabe, o Xdebug abandonou o suporte a perfis de memória desde a versão 2. *. Pesquise a string "funções removidas" aqui: http://www.xdebug.org/updates.php
Tentei outra ferramenta e funcionou bem para mim.
https://github.com/arnaud-lb/php-memory-profiler
Isso é o que fiz no meu servidor Ubuntu para ativá-lo:
E então no meu código:
Finalmente abra o
callgrind.out
arquivo com o KCachegrindUsando Google gperftools (recomendado!)
Em primeiro lugar, instale o Google gperftools baixando o pacote mais recente aqui: https://code.google.com/p/gperftools/
Então, como sempre:
Agora em seu código:
Em seguida, abra seu terminal e execute:
pprof criará uma nova janela em sua sessão de navegador existente com algo como mostrado abaixo:
Xhprof + Xhgui (o melhor na minha opinião para o perfil de CPU e memória)
Com Xhprof e Xhgui você também pode traçar o perfil do uso da CPU ou apenas do uso da memória, se esse for o seu problema no momento. É uma solução muito completa, dá-lhe total controlo e os logs podem ser escritos tanto no mongo como no sistema de ficheiros.
Para mais detalhes veja minha resposta aqui .
Fogo Preto
Blackfire é um profiler PHP da SensioLabs, os caras do Symfony2 https://blackfire.io/
Se você usar o fantoche para configurar sua máquina virtual, ficará feliz em saber que é compatível ;-)
fonte
memprof_enable
em meu código PHP e conseguiPHP Fatal error: Uncaught Error: Call to undefined function memprof_enable()
. Eu fiz gperftools make install do código-fonte atual deles.php -i
no cli ou aphpinfo()
para ver se você está carregando a extensão corretamente. Se você não o tiver, provavelmente vale a pena dar uma olhada em seus*.ini
arquivos.sudo pecl install memprof-1.0.0
.Bem, isso pode não ser exatamente o que você está procurando, mas o PHP tem algumas funções embutidas que resultarão no uso de memória. Se você quiser apenas ver quanta memória uma chamada de função está usando, você pode usar memory_get_peak_usage () antes e depois de uma chamada e tirar a diferença.
Você usa a mesma técnica em torno de seus dados usando um memory_get_usage () muito semelhante .
Abordagem pouco sofisticada, mas é uma maneira rápida de verificar um trecho de código. Eu concordo que xdebug mem deltas pode ser muito prolixo para ser útil às vezes, então geralmente eu apenas o uso para restringir a uma seção de código e, em seguida, despejo o uso de memória específico para pequenos pedaços manualmente.
fonte
http://geek.michaelgrace.org/2012/04/tracing-php-memory-usage-using-xdebug-and-mamp-on-mac/
Estou em um Mac, então se você estiver no Windows, terá que testar isso, mas funciona para mim.
Modifiquei meu arquivo tracefile-analyser.php e adicionei o caminho para o binário PHP no topo para que você pudesse chamá-lo no terminal como um script unix normal.
Não se esqueça de fazer o chmod desse arquivo para 755.
Você pode criar facilmente um script de watchr ruby para chamar automaticamente o script cada vez que ele cria um arquivo de perfil de memória (* .xt). Dessa forma, você pode continuar testando e vendo suas melhorias sem ter que executar o comando repetidamente.
fonte