在生产服务器上启用XDebug会使PHP变慢吗?

时间:2010-08-19 13:20:56

标签: php performance xdebug production-environment

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

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

我们的生产服务器也提供测试平台。有时我们使用它来测试尽可能接近生产的环境。我正在寻找的主要内容是使用XDebug的增强型var_dump()

这不是高流量应用的应用服务器,性能不是很大的问题。我很好奇XDebug对性能的影响是否强烈。

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

11 个答案:

答案 0 :(得分:39)

除了显而易见的事实,即调试消息无法在已经投入生产的应用程序中显示,而且事实上我不知道你为什么会喜欢它,因此有一些非常糟糕的事情。

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

另一个大问题是,当安装调试器时,至少大多数调试器,他们往往有在您的服务器中打开端口的恶习,因为它们不适用于生产环境,并且您可能知道,任何打开服务器端口的软件为任何黑客打开了一扇门。

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

编辑显然我的回答没有足够的记录,你应该查看这些来源

最后,有一件事我没说,因为我觉得它有点暗示:这是常识不行!您不要将调试工具放在生产服务器上,原因与将它们保存在不同环境中的原因相同,因为您需要保留不必要的东西。在服务器上运行的任何进程,无论多么轻,都会影响您的性能。

答案 1 :(得分:15)

减慢因子4

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

完全删除xdebug(即使未启用xdebug)也使页面负载提升了50%(从60ms降至30ms)。我们让xdebug处于“休眠”状态(等待触发)。我们认为,由于它处于休眠状态,因此不会造成任何伤害,但是男孩,我们错了。

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

enter image description here

答案 4 :(得分:1)

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

您的应用程序应该永远不需要打印出“那些好的调试消息”,因为它们对您的用户来说并不是很好。它们是测试不佳的标志,它们会扼杀用户的信任,特别是在企业/电子商务环境中。

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

我知道这是一篇过时的文章,但是由于Xdebug的问题仍然存在10年,所以我想指出相关的错误报告(以WONTFIX NOTABUG结尾):https://bugs.xdebug.org/view.php?id=1668

Tl; dr:

仅安装xdebug(在Linux @least上)将使站点上的所有php速度变慢,即使所有标志都设置为OFF,其点击率也从2倍提高到20倍。 永远不要安装xdebug。更好的是,研究侵入性较小的调试选项。

答案 8 :(得分:0)

您永远不应在生产服务器上显示调试错误消息。它对您的用户来说很难看,也存在安全风险。我相信它会让它变得有点慢。

答案 9 :(得分:0)

如果“做得对”,您可以在生产中使用XDebug。您可以在“休眠”模式下启用扩展,该模式仅通过通过特定HOSTS名称的请求生效。这里详细介绍:

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

答案 10 :(得分:0)

我使用此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%
------------------------------------------------