PHP内存分析

104

如何分析 PHP 页面的内存使用情况?比如,查看我的数据占用了多少内存以及哪些函数调用分配了最多的内存。

  • xdebug 在其分析功能中似乎没有提供内存信息。

  • xdebug 在其跟踪功能中提供了这个信息。这已经很接近我想要的了,但是它显示了每个函数调用的内存增量,数据量非常庞大。如果可以隐藏某个深度以下的调用(使用某个 GUI 工具可能能做到),那将解决我的问题。

还有什么别的吗?


请查看Rasmus Lerdorf的演讲,名为“Simple is Hard”(幻灯片链接:http://talks.php.net/show/froscon08,视频链接:http://www.youtube.com/watch?v=RWRYX5eJbG0)。他介绍了很多有用的工具,例如“inclued”(http://pecl.php.net/package/inclued)、xdebug和KCacheGrind。 - TML
我找到了一个xdebug的补丁,它可以在分析文件中提供内存信息。到目前为止,它运行得非常好。 - JW.
1
正如你所说,xdebug在函数跟踪中提供了信息。幸运的是,他们还提供了一个解释该信息的脚本。http://derickrethans.nl/xdebug-and-tracing-memory-usage.html 到目前为止,它对我来说似乎是有效的... - Luke H
可能是Tools to visually analyze memory usage of a PHP app的重复问题。 - Francesco Casula
4个回答

78

正如您所知,自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文件。

使用Google gperftools(推荐!)

首先下载最新的软件包,安装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会在您现有的浏览器会话中创建一个新窗口,类似于下面展示的内容:

PHP内存分析与gperftools的性能分析

Xhprof + Xhgui (我认为是同时分析CPU和内存的最佳选择)

使用XhprofXhgui,您可以同时进行CPU使用率和内存使用率分析,如果这是您目前需要解决的问题。 它是一个非常完整的解决方案,可以让您完全控制,并且日志可以同时写入Mongo或文件系统。

更多详情请参见我的回答

Blackfire

Blackfire是由SensioLabs开发的PHP分析工具,Symfony2团队的成员也在其中 https://blackfire.io/

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


你是怎么让它工作的?我试着在我的PHP代码中加入memprof_enable,但是我得到了一个PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable()的错误。我已经从它们的当前源代码中进行了gperftools make install。 - Andrey Pokhilko
在命令行上运行 php -i 或者 phpinfo() 来查看扩展是否已正确加载。如果你没有找到它,那么检查一下你的 *.ini 文件可能是值得的。 - Francesco Casula
5
注意:最新版本仅支持php7。如果您使用的是php5,请使用sudo pecl install memprof-1.0.0安装。 - Djizeus

19

嗯,这可能不完全是您要寻找的,但PHP内置了几个函数可以输出内存使用情况。如果您只想查看函数调用使用了多少内存,可以在调用之前和之后使用memory_get_peak_usage(),然后取差值。

您可以使用非常类似的memory_get_usage()技术围绕您的数据。

这是一种相当不复杂的方法,但它是检查代码片段的快速方式。我同意xdebug mem deltas有时会过于冗长而无用,因此我经常只使用它来缩小到代码部分,然后手动转储小块的具体内存使用情况。


14

5
他们甚至使用了我的门票。 :) - JW.
Xdebug在2.6版本中停止支持PHP 5。 - powtac
如果有帮助的话...当使用php-fpm时,进程ID可能在不同请求之间不会改变。在默认的profiler_output_name下,这会导致xdebug覆盖先前的数据。请使用https://xdebug.org/docs/all_settings#trace_output_name中的其他值更改此值。 - aligot
我现在正在尝试使用qcachegrind,但不理解我在看什么。我没有在任何地方看到内存数字。每个变量占用多少内存?我想要一个能够跟踪执行并显示每个点的内存以及占用该内存的变量的工具。在哪里可以获取更多信息? - john k

0

http://geek.michaelgrace.org/2012/04/tracing-php-memory-usage-using-xdebug-and-mamp-on-mac/

我使用的是Mac,如果你使用的是Windows,你需要测试一下,但这对我来说是有效的。

我修改了我的tracefile-analyzer.php文件,并在顶部添加了PHP二进制文件的路径,这样你就可以像调用普通的Unix脚本一样在终端中调用它了。

#!/Applications/MAMP/bin/php5.3/bin/php
<?php
if ( $argc <= 1 || $argc > 4 )
{

不要忘记将此文件的权限设置为755。
您可以轻松创建一个Ruby Watchr脚本,以便每次创建内存配置文件(*.xt)时自动调用该脚本。这样,您就可以在不必一遍又一遍地执行命令的情况下进行测试和查看改进。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接