【问题标题】:PHP memory profilingPHP 内存分析
【发布时间】:2010-10-27 04:45:44
【问题描述】:

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

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

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

还有别的吗?

【问题讨论】:

标签: php memory profiling


【解决方案1】:

嗯,这可能不是您正在寻找的,但是 PHP 确实有几个内置函数可以输出内存使用情况。如果你只是想看看函数调用使用了多少内存,你可以在调用前后使用memory_get_peak_usage(),然后取差值。

您使用非常相似的memory_get_usage() 围绕数据使用相同的技术。

相当简单的方法,但它是检查一段代码的快速方法。我同意 xdebug mem deltas 有时可能过于冗长而无用,所以我经常使用它来缩小代码的一部分,然后手动转储小块的特定内存使用情况。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      最后用KCachegrind打开callgrind.out文件

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

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

      使用 XhprofXhgui,您还可以分析 CPU 使用情况,或者如果这是您目前的问题,则只分析内存使用情况。 这是一个非常完整的解决方案,它可以让您完全控制,并且可以将日志写入 mongo 或文件系统中。

      更多详情see my answer here

      黑火

      Blackfire 是 SensioLabs 的 PHP 分析器,Symfony2 的家伙 https://blackfire.io/

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

      【讨论】:

      • 你是如何让它发挥作用的?我尝试将memprof_enable 放入我的PHP 代码中,然后得到PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable()。我从它们的当前源代码进行了 gperftools make install。
      • 在 cli 上运行 php -iphpinfo() 以查看是否正确加载了扩展。如果你没有它,可能值得看看你的 *.ini 文件。
      • 注意:最新版本只支持php7。如果您使用 php5,请使用 sudo pecl install memprof-1.0.0 安装。
      【解决方案4】:

      Xdebugreimplemented memory tracing in 2.6 (2018-01-29) 可用于 Qcachegrind 或类似工具。只需make sure to select the memory option :)

      来自文档:

      从 Xdebug 2.6 开始,分析器还收集有关正在使用多少内存以及哪些函数和方法增加了内存使用量的信息。

      我不熟悉文件的格式,但它的 Qcachegrind 在跟踪几个内存问题方面对我很有帮助。

      【讨论】:

      • 他们甚至用了我的票。 :)
      • Xdebug 在 2.6 版本中放弃了对 PHP 5 的支持。
      • 如果它对任何人有帮助...当使用 php-fpm 时,pid 可能不会在不同的请求之间改变。使用默认的 profiler_output_name,这会导致 xdebug 覆盖以前的数据。使用 xdebug.org/docs/all_settings#trace_output_name 中的其他内容更改此值
      • 我现在正在尝试使用 qcachegrind,但不明白我在看什么。我在任何地方都看不到内存编号。每个变量占用多少内存?我想要一些可以跟踪执行并显示每个点的内存,以及哪些变量正在占用该内存的东西。我在哪里可以获得更多信息?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      相关资源
      最近更新 更多