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