有什么免费软件或商业软件可以帮助分析PHP应用程序的内存使用情况吗?我知道xdebug可以生成跟踪文件,通过函数调用显示内存使用情况但没有图形工具,数据很难解释。
理想情况下,我希望不仅能够查看总内存使用量,还能查看堆上的对象以及与Jprofiler类似的引用它们的对象。
答案 0 :(得分:13)
正如您可能知道的那样,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"));
最后使用KCachegrind
打开callgrind.out
文件
首先在此处下载最新的软件包安装 Google gperftools :https://code.google.com/p/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或文件系统中编写日志。
有关详情see my answer here。
Blackfire是SensioLabs的PHP探查器,Symfony2人https://blackfire.io/
如果您使用puphpet设置虚拟机,您会很高兴知道它受到支持; - )
答案 1 :(得分:8)
我最近遇到了同样的问题,遗憾的是找不到任何具体的工具。
但有一些帮助是以人类可读的格式输出xdebug跟踪并启用了mem deltas(INI设置,xdebug.show_mem_deltas或者其他我认为的?)。然后在输出上运行sort(如果你在* nix上):
sort -bgrk 3 -o sorted.txt mytracefile.xt
对第三个col,即mem deltas进行排序。您还可以对第二列进行排序,在这种情况下,您可以找到应用程序总共使用最多内存的行。
当然,这无法检测到对象的内存使用何时只会以较小的增量爬升,但最终会占用大量内存。我有一个相当愚蠢的方法,试图使用对象迭代和序列化的组合来做到这一点。它可能并不完全等同于内存使用情况,但希望能够了解从哪里开始查看。请记住它会耗尽内存本身,并且还没有经过广泛测试,所以买家要小心:
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()));
另外,刚刚由同事建议这个方法(欢呼丹尼斯;-)这隐藏了低于2级缩进的步骤,你可以很容易地看到整体内存使用量跳跃的点,并且可以缩小范围减少缩进:
egrep '[0-9]+ ( ){1,2}-> ' mytracefile.xt
答案 2 :(得分:6)
对于Xdebug 2.0.4的http://www.xdebug.org/updates.php,他们在“删除的函数”部分写道:“...删除了对内存分析的支持,因为它无法正常工作......”。因此xdebug不会是一个选项
答案 3 :(得分:1)
我个人使用过https://github.com/arnaud-lb/php-memory-profiler
在PHP 5.6和Ubuntu 18上,以及用于可视化的Kcachegrind。
Kcachegrind可以,但不是最好的。我希望找到一个更好的替代方法,即使它在Mac或Windows上也是如此。
答案 4 :(得分:1)
在2018年1月29日发布的2.6.0版本中,xdebug添加了对内存使用情况分析的支持。现在,您可以生成带有时间和内存信息的callgrind文件。在Mac上,您可以使用Qcachegrind或Profiling Viewer(高级)可视化该信息。
答案 5 :(得分:0)
xdebug输出的图形工具是KCacheGrind。
答案 6 :(得分:0)
试试webgrind。它以易于阅读,基于浏览器的格式为您提供CacheGrinder的分析。我在Mac上,它使分析变得轻而易举。
答案 7 :(得分:0)
phpDesigner 2008可以使用xdebug和KCacheGrind调试和评估网站。它还有一个内置显示器。