【问题标题】:Will enabling XDebug on a production server make PHP slower?在生产服务器上启用 XDebug 会使 PHP 变慢吗?
【发布时间】:2011-04-01 03:12:16
【问题描述】:

标题几乎说明了一切......这是一个坏主意吗?我想要 XDebug 在服务器上提供的增强调试消息。

[编辑] 只是为了把事情说清楚。我知道存在安全风险。或许我应该补充我的问题,并给出我想要这样做的更准确的理由。

我们的生产服务器还托管一个测试平台。有时我们使用它在尽可能接近生产的环境中测试事物。我正在寻找的主要内容是使用 XDebug 的增强版var_dump()

这不是用于高流量应用的应用服务器,性能也不是什么大问题。我只是好奇 XDebug 是否会显着影响性能。

此外,我想我只能为定义测试站点的 VirtualHost 启用它。

【问题讨论】:

标签: php performance xdebug production-environment


【解决方案1】:

你到底为什么想要这样的东西?在部署到生产之前进行调试。它会使应用程序变慢。

【讨论】:

  • 因为生产环境是有趣的关键故障发生的地方。
  • 你应该使用 vagrant 来复制你的实时环境,这样你就可以在本地开发,但使用相同的环境设置。然后,您可以在 staging 上复制实时环境 vagrant,以便在将应用程序推送到生产环境之前对其进行调试。您永远不应该将您不知道有效的代码推送到实时/生产中
  • @JamesKirkby 通常我同意,但有时您可能需要在暂存/生产混合环境中模拟生产环境,例如您正在处理的问题仅发生在aws 上的负载均衡器并具有连接的 rds 等变量,但不知道问题出在哪里。但是,是的,只是不能在现场进行 xdebug。
【解决方案2】:

您永远不应在生产服务器上显示调试错误消息。这对您的用户来说是丑陋的,也是一个安全风险。我相信它也会让它变慢一点。

【讨论】:

  • 如果配置正确当然不会有安全风险,例如限制对本地接口的访问并仅通过 SSH 隧道连接或分析到无法访问的目录。此外,xdebug 不会向用户显示调试消息。它要么生成跟踪,要么提供调试接口,但两者都不会影响用户体验,即使发生错误也不会。唯一合法的矛盾是性能损失,因为分析器会增加每个函数调用的开销,并且可能会阻止某些优化。 (尤其是像 Facebook 的 HipHop 这样的现代运行时编译器)
【解决方案3】:

你永远不应该在生产中保留它。

您的应用程序永远不需要打印出“那些不错的调试消息”,因为它们对您的用户一点都不友好。它们是测试不佳的标志,它们会破坏用户的信任,尤其是在企业/电子商务环境中。

其次,您透露的技术信息越详细,您被黑客入侵的可能性就越大(特别是如果您已经透露您的代码实际上存在问题!)。生产服务器应该将错误记录到文件中,并且从不显示它们。

执行速度是您最不关心的问题,无论如何它都会受到影响,内存也会受到影响。

【讨论】:

  • 这就是我的想法...实际上我想要的唯一功能是增强的var_dump() 格式。我知道也存在安全风险...
  • “启用 xdebug”并不意味着“向用户显示错误消息”
【解决方案4】:

除了调试消息无法在已投入生产的应用程序中显示这一显而易见的事实,以及我不知道您为什么会喜欢这样的事实之外,还有一些非常糟糕的事情。

第一个是当你添加调试行为到你的服务器时,调试引擎“附加”到 PHP 进程并接收到引擎在断点处停止的消息,这是不好的,因为对让另一个进程停止或“保留” PHP 解析器。

另一个大问题是,在安装调试器时,至少大多数调试器往往会养成在服务器中打开端口的坏习惯,因为它们不适用于生产环境,而且您可能知道,任何在您的服务器中打开端口的软件正在为周围的任何黑客打开一扇门。

如果您需要在您的代码中进行调试,那么在您的应用程序中,实现一个调试系统,如果不可用,因为大多数框架都内置了这个。设置一个配置值,比如 DEBUG_ENABLED 并在抛出异常时,如果是未启用,重定向到一个小页面,否则重定向到一个带有调试信息的丑陋页面,但请注意您在服务器中显示的调试信息。 我希望这能澄清一切。

编辑显然我的回复没有足够的记录,您应该检查这些来源

最后,有一件事我没有说,因为我认为它有点含蓄:不这样做是常识!出于与将调试工具放在不同环境中相同的原因,您不会将调试工具放在生产服务器上,因为您需要将不必要的东西远离它。在服务器上运行的任何进程,无论它有多轻量,都会影响您的性能。

【讨论】:

  • 感谢您的回答。我已经编辑了我的问题,因为许多答案都提到了您(正确地)提出的建议:安全问题和一般的不良做法。
  • 这个答案是纯 FUD,没有证据表明 xdebug 中存在安全漏洞或性能问题。据我所知,这个答案是正确的——但它没有提供任何证据来支持其断言。使用正确的设置(例如 display_errors 关闭,并且没有远程调试),我不明白为什么 XDEBUG(毕竟是编译的代码)会比自定义解决方案执行得更差。
  • @GeorgeLund 您对那里的链接满意吗?另外,我认为将调试工具放在生产站点上是您应该避免的,因为这很有意义......
  • 谢谢!我很生气的是 PHP 在没有 XDebug(任何其他选项?)的情况下无法原生地对异常产生完整的堆栈跟踪——其他语言没有这个问题。 (哎呀,即使使用 C,在极端情况下您也可以获得核心转储!)
  • 请注意,这些链接只是讨论在生产中使用 xdebug 对性能的影响,并没有表明这是一个坏主意。第一个链接说“XDebug 是一个很棒的工具,是商业 Zend Server 的一个很好的替代品,但是它不像 Zend Server 那样适合生产环境。”在实时和实时访问更多调试信息并没有“错误”有时会出现一些细微的错误,这些错误只会在现场出现。我们碰巧使用了 kohana,它有一个很好的 html 堆栈跟踪生成器,所以这对我们来说不是问题。
【解决方案5】:

减速 4 倍

我做了一些测试,只是启用模块,没有实际调试,使我的开发机器上的请求从 1 秒减慢到 4 秒左右

【讨论】:

  • 什么样的测试? PHP 的哪些部分变慢了?测试框架是什么?
  • @Aredridel 没有框架。我有一个 Magento 商店并调用了一个页面,并在 Chrome 开发人员工具网络选项卡中比较了结果。没有调查哪些部分变慢了。
  • 啊,变异的可能性很大。
  • 我刚遇到这个问题,如果我的调试器正在运行,我的代码会比不运行时更快。从启用 IDE (PhpStorm) 调试的
  • @Vadorequest(只是为了将来的读者)这是因为您没有禁用 xdebug 远程并且它试图连接到您的 ide(它已关闭并且没有响应)。
【解决方案6】:

Xdebug 用于将完整的堆栈跟踪添加到错误日志,即 display_errors ini 值,当然应该关闭(即使在开发中我也不想要这个)。除非您启用 remote_attach ini 设置,否则它不允许远程连接到调试器。虽然速度较慢,但​​如果您遇到诸如分配的最大内存或分段错误之类的 PHP 神秘错误,这是您查看实际发生位置的唯一方法。

【讨论】:

  • "Xdebug 用于将完整的堆栈跟踪添加到错误日志中" -> 不; Xdebug 用于调试和分析。它可以在错误消息中提供堆栈跟踪,但这不是它的主要目的。 “除非您启用 remote_attach ini 设置,否则它不允许远程连接到调试器”-> 没有像“remote_attach”ini 设置这样的东西;也许你的意思是xdebug.remote_enable。最后,这更像是一个评论而不是一个答案。
【解决方案7】:

您始终可以使用完全相同的配置克隆您的实时服务器,但它不会公开。 然后你可以在它上面安装 XDebug 并在几乎完全相同的条件下调试东西(好吧,现实生活和克隆之间的负载会有所不同,但其余的都是一样的)。 在这种情况下,您在实时环境中调试事物,但实际生活不受影响。

注意:显然它不适用于任何人。不是每个人都可以轻松克隆服务器。如果您使用 AWS 等云服务,那将非常容易。如果您使用 Ansible、Chef、Puppet 等服务器配置工具来构建服务器,这也是小菜一碟。

【讨论】:

    【解决方案8】:

    如果你“做对了”,你可以在生产环境中使用 XDebug。您可以在“休眠”模式下启用扩展,该模式仅通过通过特定主机名称的请求才能生效。在此处查看详细信息:

    http://www.drupalonwindows.com/en/content/remote-debugging-production-php-applications-xdebug

    【讨论】:

    • 即使在没有“启用”的情况下,只要有可用的 xdebug 扩展就会增加大量的性能开销。即使未启用,它也会直接连接到 zend 引擎
    【解决方案9】:

    完全删除 xdebug(即使未启用)使我们的页面加载速度提高了 50%(从 60 毫秒降至 30 毫秒)。我们让 xdebug 处于“休眠”状态(等待触发)。我们认为既然它处于休眠状态,它不会造成任何伤害,但我们错了。

    我们在 21:43 左右注释掉了 php 配置中的 zend_extension 行。每个核心的平均负载也从 0.4 下降到 0.2:

    【讨论】:

    【解决方案10】:

    我知道这是一篇旧帖子,但由于 Xdebug 的问题在 10 年后仍然存在,我想指出相关的错误报告(作为 WONTFIX NOTABUG 关闭):https://bugs.xdebug.org/view.php?id=1668

    Tl;博士:

    只需安装 xdebug 就会(在 linux @least 上)使网站上的所有 php 慢到爬行,命中率从 2 倍到 20 倍不等,即使所有标志都设置为 OFF。 永远不要在生产环境中安装 xdebug。 更好的是,研究侵入性较小的调试选项。

    【讨论】:

      【解决方案11】:

      我使用此php benchmark tool 测试了性能影响。免责声明我构建了该工具。

      答案是 xdebug 模块显着减慢了代码执行速度:从 2 倍到 7 倍,具体取决于测试。这是我的结果:

      # env information
      php version        :     7.4.5
      platform           : WINNT x64
      
      # disable xdebug extension in php.ini
      $ php src/benchmark.php --iterations 1000 --time-per-iteration 50 --save xdebug_off
      
      # enable xdebug extension
      $ php src/benchmark.php --iterations 1000 --time-per-iteration 50 --save xdebug_on
      
      # compare
      $ php src/compare.php --file1 benchmark_xdebug_off_20201127-0946.txt --file2 benchmark_xdebug_on_20201127-0939.txt
      ------------------------------------------------
      test_math                  OFF       ON
      mean               :      3762      531   -85.9%
      median             :      4226      568   -86.6%
      mode               :      4655      596   -87.2%
      minmum             :       918      188   -79.5%
      maximum            :      4722      612   -87.0%
      quartile 1         :      3081      490   -84.1%
      quartile 3         :      4580      595   -87.0%
      IQ range           :      1498      105   -93.0%
      std deviation      :       984       87   -91.1%
      normality          :     11.0%    11.0%
      ------------------------------------------------
      test_strings
      mean               :      1419      677   -52.3%
      median             :      1521      688   -54.7%
      mode               :      1580      974   -38.4%
      minmum             :       537       90   -83.2%
      maximum            :      1629     1071   -34.3%
      quartile 1         :      1319      452   -65.7%
      quartile 3         :      1582      892   -43.6%
      IQ range           :       262      440    67.8%
      std deviation      :       226      248     9.8%
      normality          :      6.6%     6.6%
      ------------------------------------------------
      test_loops
      mean               :      8131     1208   -85.1%
      median             :      8617     1240   -85.6%
      mode               :      9109     1407   -84.6%
      minmum             :      3167      589   -81.4%
      maximum            :      9666     1435   -85.2%
      quartile 1         :      7390     1116   -84.9%
      quartile 3         :      9253     1334   -85.6%
      IQ range           :      1863      217   -88.3%
      std deviation      :      1425      164   -88.4%
      normality          :      5.6%     5.6%
      ------------------------------------------------
      test_if_else
      mean               :    279630    31263   -88.8%
      median             :    293553    31907   -89.1%
      mode               :    303706    37696   -87.6%
      minmum             :    104279    12560   -88.0%
      maximum            :    322143    37696   -88.3%
      quartile 1         :    261977    28386   -89.2%
      quartile 3         :    307904    34773   -88.7%
      IQ range           :     45927     6387   -86.1%
      std deviation      :     39034     4405   -88.7%
      normality          :      4.7%     4.7%
      ------------------------------------------------
      test_arrays
      mean               :      5705     3275   -42.6%
      median             :      5847     3458   -40.9%
      mode               :      6040     3585   -40.6%
      minmum             :      3366     1609   -52.2%
      maximum            :      6132     3645   -40.6%
      quartile 1         :      5603     3098   -44.7%
      quartile 3         :      5965     3564   -40.3%
      IQ range           :       361      465    28.8%
      std deviation      :       404      394    -2.5%
      normality          :      2.4%     2.4%
      ------------------------------------------------
      

      【讨论】:

        猜你喜欢
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 2013-01-05
        • 1970-01-01
        • 2014-09-13
        • 1970-01-01
        • 2015-04-14
        相关资源
        最近更新 更多