PHP内存分析


95

剖析PHP页面的内存使用情况的好方法是什么?例如,查看我的数据正在使用多少内存,和/或哪些函数调用分配了最多的内存。

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

  • xdebug 确实在其跟踪功能提供了它。这与我想要的非常接近,除了庞大的数据量是压倒性的,因为它显示了每个单个函数调用的内存增量。如果可以使用某些GUI工具将呼叫隐藏在一定深度以下,那将解决我的问题。

还有别的事吗?


请查看拉斯穆斯· 勒多夫(Rasmus Lerdorf)的演讲“简单就是硬”(幻灯片为talks.php.net/show/froscon08,视频为youtube.com/watch?v=RWRYX5eJbG0)。他介绍了许多有用的工具,例如“包含”(pecl.php.net/package/inclued),xdebug和KCacheGrind。
TML

我找到了xdebug补丁,该补丁在配置文件中提供了内存信息。到目前为止,它运行良好。
JW。

1
如您所说,xdebug在功能跟踪中提供信息。幸运的是,他们还提供了一个脚本来解释这一点。derickrethans.nl/xdebug-and-tracing-memory-usage.html到目前为止,这似乎对我有用 ...
Luke H

Answers:


10

Xdebug 在2.6(2018-01-29)中重新实现了内存跟踪,可以在Qcachegrind或类似工具中使用它。只要确保选择内存选项即可:)

从文档:

从Xdebug 2.6开始,事件探查器还收集有关正在使用多少内存以及哪些功能可以提高内存使用率的信息。

我不熟悉文件的格式,但是Qcachegrind在跟踪几个内存问题方面对我非常有用。

qcachegrind示例


4
他们甚至用了我的票。:)
JW。

Xdebug在2.6版本中放弃了对PHP 5的支持。
powtac

如果对任何人有帮助...使用php-fpm时,pid在不同的请求之间可能不会更改。使用默认profiler_output_name,这会导致xdebug覆盖以前的数据。使用xdebug.org/docs/all_settings#trace_output_name中的
aligot

我正在尝试使用qcachegrind,现在不明白我在看什么。我在任何地方都看不到内存号。每个变量占用多少内存?我想要一些可以跟踪执行并显示每个点的内存以及什么变量占用该内存的东西。在哪里可以获取更多信息?
john ktejik

72

您可能知道,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"));

最后callgrind.outKCachegrind打开文件

使用Google gperftools(推荐!)

首先,通过在此处下载最新的软件包来安装Google gperftoolshttps//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将在您现有的浏览器会话中创建一个新窗口,如下所示:

使用memprof和gperftools进行PHP内存分析

Xhprof + Xhgui(我认为最好的配置cpu和内存的文件)

使用XhprofXhgui,您还可以分析cpu的使用情况,或者仅分析内存使用情况(如果这是当前的问题)。这是一个非常完整的解决方案,它使您可以完全控制,并且日志可以写在mongo或文件系统中。

有关更多详细信息,请在此处查看我的答案

黑火

Blackfire是由Symfony2伙计SensioLabs开发的PHP分析器https://blackfire.io/

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


您是如何工作的?我试图放入memprof_enable我的PHP代码中,我得到了PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable()。我做了gperftools从它们的当前源代码进行安装。
Andrey Pokhilko

php -i在cli或a 上运行a ,phpinfo()以查看是否正确加载了扩展程序。如果您没有它,可能值得看看您的*.ini文件。
Francesco Casula

5
注意:最新版本仅支持php7。如果您使用php5,请使用进行安装sudo pecl install memprof-1.0.0
Djizeus

18

好吧,这可能并不是您要找的东西,但是PHP确实有一些内置函数可以输出内存使用情况。如果您只想查看函数调用使用了多少内存,则可以在调用之前和之后使用memory_get_peak_usage()并取其差值。

您可以使用非常相似的memory_get_usage()对数据使用相同的技术。

相当简单的方法,但这是签出一段代码的快速方法。我同意xdebug mem增量可能太冗长而有时无法使用,因此我经常只使用它来缩小代码段,然后手动丢弃小块的特定内存使用情况。


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)时自动调用该脚本。这样,您就可以继续测试并查看改进,而不必一遍又一遍地执行命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.