是否有任何免费或商业软件可以辅助分析PHP应用程序的内存使用情况?我知道xdebug可以生成跟踪文件,显示函数调用的内存使用情况,但没有图形化工具,数据很难解释。
理想情况下,我希望能够查看不仅是总内存使用情况,还希望查看堆上的对象以及谁引用了它们,类似于Jprofiler。
是否有任何免费或商业软件可以辅助分析PHP应用程序的内存使用情况?我知道xdebug可以生成跟踪文件,显示函数调用的内存使用情况,但没有图形化工具,数据很难解释。
理想情况下,我希望能够查看不仅是总内存使用情况,还希望查看堆上的对象以及谁引用了它们,类似于Jprofiler。
正如你可能知道的那样,自从 2.* 版本以来,Xdebug 放弃了内存分析支持。请在这里搜索“已删除的功能”字符串: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
文件。
首先,通过下载最新的软件包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是SensioLabs开发的PHP性能分析工具,由Symfony2的开发团队打造 https://blackfire.io/
如果你使用 puphpet 来设置你的虚拟机,那么你会很高兴知道它是被支持的 ;-)
sudo pecl install memprof
doesn't get pass make
stage. Gives error:Makefile:194: recipe for target 'memprof.lo' failed
- Buddymaster
的分支,仅支持PHP 7,还有一个名为php5
的分支,仅支持PHP5。 - starbeamrainbowlabs最近我遇到了相同的问题,可惜没有找到特定的工具。
但是有一些帮助的方式,就是使用启用内存增量的xdebug跟踪以人类可读格式输出(一个INI设置,我认为是xdebug.show_mem_deltas什么的)。然后在输出上运行sort命令(如果你在*nix上):
sort -bgrk 3 -o sorted.txt mytracefile.xt
该命令将按第三列(内存增量)排序。您也可以按第二列排序,这样您就可以找到应用程序总体上使用的最大内存所在行。
当然,这无法检测对象的内存使用量只以小增量增加但最终会使用大量内存的情况。我有一种相当简单的方法尝试通过对象迭代和序列化来解决这个问题。它可能不完全等同于内存使用情况,但希望能够提供开始查找的思路。请注意,它本身将使用内存,并且还未经过广泛测试,敬请谨慎:
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建议了一种方法(感谢Dennis;-))可以隐藏两个缩进级别以下的步骤,您可以很容易地看到总体内存使用量跳升的点,并通过增加缩进来缩小范围:
egrep '[0-9]+ ( ){1,2}-> ' mytracefile.xt
在 Xdebug 2.0.4 的 更新页面 的 "removed functions" 栏目中写道:"...删除了内存分析功能,因为它不能正常工作...". 因此,xdebug 不再是一个选项。
在2018年1月29日的2.6.0版本中,xdebug增加了对内存使用分析的支持。现在您可以生成带有时间和内存信息的callgrind文件。在Mac上,您可以使用Qcachegrind或Profiling Viewer(高级版)来可视化该信息。
试试webgrind。它可以以易于阅读的基于浏览器的格式为您提供CacheGrinder的配置文件。我用Mac,这让分析变得轻而易举。
phpDesigner 2008 可以使用 xdebug 和 KCacheGrind 调试和基准测试网站。它还具有内置监视器。