PHP内存分析
什么是分析PHP页面的内存使用情况的好方法? 例如,要查看我的数据正在使用多less内存,和/或哪些函数调用正在分配最多的内存。
-
xdebug似乎没有提供内存信息的分析function。
-
xdebug在它的跟踪function中提供了它。 这与我想要的非常接近,除了绝对数量的数据是压倒性的,因为它显示了每个函数调用的内存增量。 如果可以将呼叫隐藏在某个深度以下,那么可以使用一些GUI工具,这将解决我的问题。
还有别的事吗?
正如你可能知道的那样,自从2. *版本以来,Xdebug放弃了内存分析支持。 请在这里search“删除的函数”string: http : //www.xdebug.org/updates.php
删除了function
由于无法正常工作,删除了对内存分析的支持。
所以我已经尝试了另一种工具,它对我很好。
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"));
然后打开你的terminal并启动:
pprof --web /tmp/profile.heap
pprof将在您现有的浏览器会话中创build一个新窗口,如下所示:
Xhprof + Xhgui(在我看来最好的configurationCPU和内存)
有了Xhprof和Xhgui,你可以分析CPU使用情况,或者只是内存使用情况,如果这是你的问题。 这是一个非常完整的解决scheme,它可以让你完全控制,日志可以写在mongo或文件系统中。
欲了解更多详情, 请参阅我的答案 。
黑火
Blackfire是SensioLabs的一个PHP profiler,Symfony2的家伙https://blackfire.io/
如果你使用puphpet来设置你的虚拟机,你会很高兴知道它的支持;-)
那么,这可能不是你正在寻找的,但PHP确实有一些内置的function,将输出内存使用情况。 如果您只想查看函数调用正在使用多less内存,则可以在调用之前和之后使用memory_get_peak_usage() ,并采取差异。
你使用类似的memory_get_usage()在你的数据中使用相同的技术。
相当简单的方法,但它是检查一段代码的快速方法。 我同意xdebug mem deltas可能太冗长,有时候很有用,所以我经常用它来缩小一段代码,然后手工转储出小块的特定内存使用情况。
http://geek.michaelgrace.org/2012/04/tracing-php-memory-usage-using-xdebug-and-mamp-on-mac/
我在Mac上,所以如果你在Windows上,你将不得不testing这个,但这对我有用。
我修改了我的tracefile-analyzer.php文件,并将path添加到顶层的PHP二进制文件中,以便可以在terminal中将其作为普通的unix脚本调用。
#!/Applications/MAMP/bin/php5.3/bin/php <?php if ( $argc <= 1 || $argc > 4 ) {
不要忘记把这个文件改为755。
您可以轻松创build一个ruby watchr脚本,在每次创build内存configuration文件(* .xt)时自动调用该脚本。 这样,您可以继续testing并查看您的改进,而不必一遍又一遍地执行命令。