首页 文章

PHP内存分析

提问于
浏览
84

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

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

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

还有别的事吗?

4 回答

  • 64

    Xdebug reimplemented memory tracing in 2.6(2018-01-29)可以在Qcachegrind或类似工具中使用 . 只是make sure to select the memory option :)

    来自文档:

    从Xdebug 2.6开始,探查器还会收集有关正在使用多少内存的信息,以及aGnd方法增加内存使用量的功能 .

    我不熟悉文件的格式,但是Qcachegrind在跟踪几个内存问题时对我很有帮助 .

    qcachegrind sample

  • 6

    您可能知道,自从2. *版本以来,Xdebug删除了内存分析支持 . 请在此处搜索"removed functions"字符串: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 文件

    使用谷歌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将在您现有的浏览器会话中创建一个新窗口,如下所示:

    PHP memory profiling with memprof and gperftools

    Xhprof Xhgui(在我看来,最好的配置cpu和内存)

    使用 XhprofXhgui ,你可以分析cpu的使用情况,或者只是内存使用情况,如果_2622423是一个非常完整的解决方案,它可以让你完全控制,并且可以在mongo或文件系统中写入日志 .

    有关详细信息see my answer here .

    Blackfire

    Blackfire是SensioLabs的PHP探查器,Symfony2人https://blackfire.io/

    如果您使用puphpet设置虚拟机,则支持'll be happy to know it' ;-)

  • 0

    好吧,这可能不是你想要的,但PHP确实有几个内置函数可以输出内存使用量 . 如果您只想查看函数调用使用了多少内存,可以在调用之前和之后使用memory_get_peak_usage(),并采取不同之处 .

    您使用非常相似的memory_get_usage()在数据周围使用相同的技术 .

    非常简单的方法,但它是检查一段代码的快速方法 . 我同意xdebug mem deltas有时候太冗长了,所以我经常只是用它来缩小代码的一部分,然后手动转出小块的特定内存使用量 .

  • 17

    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 )
    {
    

    不要忘记将此文件chmod到755 .

    您可以轻松创建ruby watchr脚本,以便在每次创建内存配置文件(* .xt)时自动调用该脚本 . 这样,您可以不必一遍又一遍地执行命令,继续测试和查看您的改进 .

相关问题