如何分析 PHP 页面的内存使用情况?比如,查看我的数据占用了多少内存以及哪些函数调用分配了最多的内存。
xdebug 在其分析功能中似乎没有提供内存信息。
xdebug 在其跟踪功能中提供了这个信息。这已经很接近我想要的了,但是它显示了每个函数调用的内存增量,数据量非常庞大。如果可以隐藏某个深度以下的调用(使用某个 GUI 工具可能能做到),那将解决我的问题。
还有什么别的吗?
如何分析 PHP 页面的内存使用情况?比如,查看我的数据占用了多少内存以及哪些函数调用分配了最多的内存。
xdebug 在其分析功能中似乎没有提供内存信息。
xdebug 在其跟踪功能中提供了这个信息。这已经很接近我想要的了,但是它显示了每个函数调用的内存增量,数据量非常庞大。如果可以隐藏某个深度以下的调用(使用某个 GUI 工具可能能做到),那将解决我的问题。
还有什么别的吗?
正如您所知,自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,下载链接在这里: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来设置虚拟机,您会很高兴知道它受到支持 ;-)
memprof_enable
,但是我得到了一个PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable()
的错误。我已经从它们的当前源代码中进行了gperftools make install。 - Andrey Pokhilkophp -i
或者 phpinfo()
来查看扩展是否已正确加载。如果你没有找到它,那么检查一下你的 *.ini
文件可能是值得的。 - Francesco Casulasudo pecl install memprof-1.0.0
安装。 - Djizeus嗯,这可能不完全是您要寻找的,但PHP内置了几个函数可以输出内存使用情况。如果您只想查看函数调用使用了多少内存,可以在调用之前和之后使用memory_get_peak_usage(),然后取差值。
您可以使用非常类似的memory_get_usage()技术围绕您的数据。
这是一种相当不复杂的方法,但它是检查代码片段的快速方式。我同意xdebug mem deltas有时会过于冗长而无用,因此我经常只使用它来缩小到代码部分,然后手动转储小块的具体内存使用情况。
Xdebug 在2018年1月29日重新实现了内存追踪功能, 这可以用于Qcachegrind或类似的工具中。只需确保选择内存选项 :)
根据文档:
自从Xdebug 2.6版本以来,分析器也收集有关使用了多少内存以及哪些函数和方法增加了内存使用量的信息。
我不熟悉文件格式,但是在跟踪一些内存问题时,Qcachegrind对我非常有帮助。
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 )
{