PHP アプリケーションによるメモリ使用量の分析を容易にするフリーウェアまたは商用のものはありますか? xdebug が関数呼び出しによるメモリ使用量を示すトレース ファイルを生成できることは知っていますが、グラフィカル ツールがないとデータを解釈するのは困難です。
理想的には、総メモリ使用量だけでなく、ヒープ上にあるオブジェクトと、Jprofilerのように誰がそれらを参照しているかを表示できるようにしたいと考えています。
PHP アプリケーションによるメモリ使用量の分析を容易にするフリーウェアまたは商用のものはありますか? xdebug が関数呼び出しによるメモリ使用量を示すトレース ファイルを生成できることは知っていますが、グラフィカル ツールがないとデータを解釈するのは困難です。
理想的には、総メモリ使用量だけでなく、ヒープ上にあるオブジェクトと、Jprofilerのように誰がそれらを参照しているかを表示できるようにしたいと考えています。
ご存じのとおり、Xdebug は 2.* バージョン以降、メモリ プロファイリングのサポートを廃止しました。ここで「削除された関数」文字列を検索してください: http://www.xdebug.org/updates.php
削除された機能
メモリ プロファイリングが適切に機能しなかったため、サポートを削除しました。
そこで、別のツールを試してみましたが、うまくいきました。
https://github.com/arnaud-lb/php-memory-profiler
これは、Ubuntuサーバーで有効にするために行ったことです。
sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof
echo "extension=memprof.so" > /etc/php5/mods-available/memprof.ini
sudo php5enmod memprof
service apache2 restart
そして、私のコードでは:
<?php
memprof_enable();
// do your stuff
memprof_dump_callgrind(fopen("/tmp/callgrind.out", "w"));
最後にKCachegrindcallgrind.outでファイルを開きます
まず、https ://code.google.com/p/gperftools/ から最新のパッケージをダウンロードして、 Google gperftoolsをインストールします。
それからいつものように:
sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install
今あなたのコードで:
memprof_enable();
// do your magic
memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));
次に、ターミナルを開いて起動します。
pprof --web /tmp/profile.heap
pprofは、既存のブラウザー セッションに新しいウィンドウを作成し、次のようにします。

XhprofとXhguiを使用すると、CPU の使用状況をプロファイリングすることも、現時点で問題がある場合はメモリの使用状況だけをプロファイリングすることもできます。これは非常に完全なソリューションであり、完全に制御でき、ログは mongo またはファイルシステムの両方に書き込むことができます。
詳細については、こちらの回答を参照してください。
Blackfire は、Symfony2 の連中である SensioLabs による PHP プロファイラーですhttps://blackfire.io/
puphpetを使用して仮想マシンをセットアップする場合は、それがサポートされていることを知って喜んでいるでしょう ;-)
最近同じ問題に遭遇しましたが、残念ながら特定のツールが見つかりませんでした。
しかし、助けになったのは、memデルタを有効にしてxdebugトレースを人間が読める形式で出力することでした(INI設定、xdebug.show_mem_deltasまたは何か?)。次に、出力に対して sort (*nix を使用している場合) を実行します。
sort -bgrk 3 -o sorted.txt mytracefile.xt
これは、3 列目のメモリ デルタでソートされます。2 番目の列で並べ替えることもできます。この場合、アプリが合計で最も多くのメモリを使用している行を見つけることができます。
もちろん、オブジェクトのメモリ使用量が少しずつ増加し、最終的に大量のメモリを使用することになる場合は、これでは検出できません。オブジェクトの反復とシリアル化の組み合わせを使用してこれを実行しようとする、かなりばかげた方法があります。おそらくメモリ使用量と正確に一致するわけではありませんが、どこから調べればよいかのアイデアが得られることを願っています。それはメモリ自体を使い果たし、また広範囲にテストされていないことを心に留めておいてください。
function analyzeMem($obj, $deep=false)
{
if (!is_scalar($obj))
{
$usage = array('Total'=>strlen(serialize($obj)));
while (list($prop, $propVal) = each($obj))
{
if ($deep && (is_object($propVal) || is_array($propVal)))
{
$usage['Children'][$prop] = analyzeMem($propVal);
}
else
{
$usage['Children'][$prop] = strlen(serialize($propVal));
}
}
return $usage;
}
else
{
return strlen(serialize($obj));
}
}
print_r(analyzeMem(get_defined_vars()));
また、同僚からこの方法が提案されました (Dennis に乾杯 ;-) これにより、2 レベルのインデントより下のステップが非表示になります。全体的なメモリ使用量が急増するポイントを簡単に確認できます。インデント:
egrep '[0-9]+ ( ){1,2}-> ' mytracefile.xt
Xdebug 2.0.4のhttp://www.xdebug.org/updates.phpで、「削除された関数」のセクションに次のように記述しています。「...正しく機能しなかったため、メモリプロファイリングのサポートを削除しました...」。したがって、xdebugはオプションにはなりません
webgrindを試してください。読みやすいブラウザベースの形式で CacheGrinder のプロファイリングを提供します。私は Mac を使用していますが、プロファイリングが簡単になりました。
xdebug 出力のグラフィカル ツールは KCacheGrindです。
phpDesigner 2008 は、xdebug と KCacheGrind を使用して Web サイトのデバッグとベンチマークを行うことができます。モニターも内蔵しています。