是否有任何免费软件或商业软件可以帮助分析 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
打开文件
首先通过在此处下载最新软件包来安装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 或文件系统中。
有关更多详细信息,请参见我的答案。
Blackfire 是 SensioLabs 的 PHP 分析器,Symfony2 的家伙https://blackfire.io/
如果您使用puphpet设置您的虚拟机,您会很高兴知道它受支持;-)
我最近遇到了同样的问题,不幸的是找不到任何特定的工具。
但是有帮助的是在启用 mem deltas 的情况下以人类可读的格式输出 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 ;-) 这隐藏了低于 2 级缩进的步骤,您可以很容易地看到整体内存使用率上升的点,并且可以通过增加来缩小范围缩进:
egrep '[0-9]+ ( ){1,2}-> ' mytracefile.xt
在Xdebug 2.0.4 的http://www.xdebug.org/updates.php上,他们在“删除的功能”部分中写道:“......删除了对内存分析的支持,因为它不能正常工作......”。因此 xdebug 不会是一个选项
我个人使用https://github.com/arnaud-lb/php-memory-profiler
在 PHP 5.6 和 Ubuntu 18 上,以及用于可视化的 Kcachegrind。
Kcachegrind 还可以,但不是最好的。我希望找到更好的替代方案,即使它在 Mac 或 Windows 上。
在 2018 年 1 月 29 日的 2.6.0 版本中,xdebug 添加了对分析内存使用情况的支持。现在您可以生成带有时间和内存信息的 callgrind 文件。在 Mac 上,您可以使用 Qcachegrind 或Profiling Viewer(高级版)来可视化该信息。
xdebug 输出的图形工具是KCacheGrind。
尝试webgrind。它以易于阅读、基于浏览器的格式为您提供 CacheGrinder 的分析。我在 Mac 上,它使分析变得轻而易举。
phpDesigner 2008 可以使用 xdebug 和 KCacheGrind 调试和基准测试网站。它还具有内置监视器。