可视化分析PHP应用程序内存使用情况的工具

可视化分析PHP应用程序内存使用情况的工具,php,memory-management,profiling,Php,Memory Management,Profiling,是否有任何免费软件或商业软件可以帮助PHP应用程序分析内存使用情况?我知道xdebug可以生成跟踪文件,通过函数调用显示内存使用情况,但如果没有图形工具,数据很难解释 理想情况下,我希望不仅能够查看总内存使用情况,还能够查看堆上的对象以及引用它们的类似对象。一个用于xdebug输出的图形工具是。试试看。它以易于阅读、基于浏览器的格式提供CacheGrinder的评测。我在Mac电脑上,它让评测变得轻而易举。phpdesigner2008可以使用xdebug和KCacheGrind调试和测试网站。

是否有任何免费软件或商业软件可以帮助PHP应用程序分析内存使用情况?我知道xdebug可以生成跟踪文件,通过函数调用显示内存使用情况,但如果没有图形工具,数据很难解释


理想情况下,我希望不仅能够查看总内存使用情况,还能够查看堆上的对象以及引用它们的类似对象。

一个用于xdebug输出的图形工具是。

试试看。它以易于阅读、基于浏览器的格式提供CacheGrinder的评测。我在Mac电脑上,它让评测变得轻而易举。

phpdesigner2008可以使用xdebug和KCacheGrind调试和测试网站。它还有一个内置的监视器。

我最近遇到了同样的问题,不幸的是找不到任何特定的工具

但有一点很有帮助,那就是在启用mem delta的情况下以人类可读的格式输出xdebug跟踪(INI设置xdebug.show_mem_delta或我认为是什么?)。然后对输出运行sort(如果启用*nix):

sort -bgrk 3 -o sorted.txt mytracefile.xt 
在第三个山口,mem Delta。您还可以在第二列进行排序,在这种情况下,您可以找到应用程序使用的内存最多的行

当然,当一个对象的内存使用量只是以小的增量缓慢增加,但最终却使用了大量的内存时,这无法检测到。我有一个相当愚蠢的方法,它尝试使用对象迭代和序列化的组合来实现这一点。它可能并不完全等同于内存使用,但希望能给出从哪里开始查找的想法。请记住,它本身会耗尽内存,而且还没有经过广泛测试,因此买家要小心:

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上,他们在“删除的函数”一节中写道:“…删除了对内存分析的支持,因为它不能正常工作…”。因此,xdebug不会成为一个选项

您可能知道,xdebug从2.*版本起就放弃了内存分析支持。请在此处搜索“已删除函数”字符串:

删除的功能

删除了对内存分析的支持,因为它无法正常工作

所以我尝试了另一种工具,它对我很有效

这是我在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"));
现在在您的代码中:

memprof_enable();

// do your magic

memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));
然后打开终端并启动:

pprof --web /tmp/profile.heap
pprof将在现有浏览器会话中创建一个新窗口,如下所示:

Xhprof+Xhgui(在我看来,最好的配置cpu和内存) 使用XhprofXhgui您还可以分析cpu使用情况,或者如果这是您目前的问题,您可以只分析内存使用情况。 这是一个非常完整的解决方案,它为您提供了完全的控制,日志可以写入mongo或文件系统

更多细节

黑火 Blackfire是Symfony2人SensioLabs开发的PHP分析器

如果您使用设置虚拟机,您会很高兴知道它受支持;-)

我个人用过

在PHP5.6和Ubuntu18上,以及用于可视化的Kcachegrind上


Kcachegrind还可以,但不是最好的。我希望找到更好的替代方案,即使是在Mac或Windows上。

在2018-01-29的2.6.0版本中,xdebug增加了对内存使用情况分析的支持。现在,您可以生成包含时间和内存信息的callgrind文件。在Mac上,您可以使用Qcachegrind或(premium)等工具可视化这些信息


我知道KCacheGrind和WinCacheGrind。据我所知,这两个工具都不允许分析内存使用情况。不幸的是,webgrind不报告内存使用情况——只报告执行速度。它处理内存使用情况分析还是性能分析?在他们的网站上,我只看到了性能评测。我不能告诉你。这个程序的程序员是个很好的人。给他发封邮件问问你自己也无妨!可能重复的
sudo pecl install memprof
未通过
make
stage。给出错误:
Makefile:194:recipe for target'memprof.lo'失败
需要注意的是php内存探查器不支持php7。应接受答案。。。谢谢你的信息。请注意,尽管kcachegrind/qcachegrind是为CPU分析而设计的,但当您分析php内存探查器输出的cachegrind文件时,您会发现名为的值和字段与内存分析相对应。@HeathN确实如此。存储库中有一个只支持PHP7的
master
分支,还有一个只支持php5的
php5
分支。
pprof --web /tmp/profile.heap