剖析PHP页面的内存使用情况的好方法是什么?例如,查看我的数据正在使用多少内存,和/或哪些函数调用分配了最多的内存。
xdebug似乎没有在其性能分析功能中提供内存信息。
xdebug 确实在其跟踪功能中提供了它。这与我想要的非常接近,除了庞大的数据量是压倒性的,因为它显示了每个单个函数调用的内存增量。如果可以使用某些GUI工具将呼叫隐藏在一定深度以下,那将解决我的问题。
还有别的事吗?
剖析PHP页面的内存使用情况的好方法是什么?例如,查看我的数据正在使用多少内存,和/或哪些函数调用分配了最多的内存。
xdebug似乎没有在其性能分析功能中提供内存信息。
xdebug 确实在其跟踪功能中提供了它。这与我想要的非常接近,除了庞大的数据量是压倒性的,因为它显示了每个单个函数调用的内存增量。如果可以使用某些GUI工具将呼叫隐藏在一定深度以下,那将解决我的问题。
还有别的事吗?
Answers:
Xdebug 在2.6(2018-01-29)中重新实现了内存跟踪,可以在Qcachegrind或类似工具中使用它。只要确保选择内存选项即可:)
从文档:
从Xdebug 2.6开始,事件探查器还收集有关正在使用多少内存以及哪些功能可以提高内存使用率的信息。
我不熟悉文件的格式,但是Qcachegrind在跟踪几个内存问题方面对我非常有用。
您可能知道,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.out
用KCachegrind打开文件
首先,通过在此处下载最新的软件包来安装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是由Symfony2伙计SensioLabs开发的PHP分析器https://blackfire.io/
如果您使用puphpet来设置您的虚拟机,您将很高兴知道它的支持;-)
memprof_enable
我的PHP代码中,我得到了PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable()
。我做了gperftools从它们的当前源代码进行安装。
php -i
在cli或a 上运行a ,phpinfo()
以查看是否正确加载了扩展程序。如果您没有它,可能值得看看您的*.ini
文件。
sudo pecl install memprof-1.0.0
。
好吧,这可能并不是您要找的东西,但是PHP确实有一些内置函数可以输出内存使用情况。如果您只想查看函数调用使用了多少内存,则可以在调用之前和之后使用memory_get_peak_usage()并取其差值。
您可以使用非常相似的memory_get_usage()对数据使用相同的技术。
相当简单的方法,但这是签出一段代码的快速方法。我同意xdebug mem增量可能太冗长而有时无法使用,因此我经常只使用它来缩小代码段,然后手动丢弃小块的特定内存使用情况。
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)时自动调用该脚本。这样,您就可以继续测试并查看改进,而不必一遍又一遍地执行命令。