Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不增加性能开销的情况下将Xdebug模块加载到PHP中? TLDR:_Php_Performance_Xdebug - Fatal编程技术网

如何在不增加性能开销的情况下将Xdebug模块加载到PHP中? TLDR:

如何在不增加性能开销的情况下将Xdebug模块加载到PHP中? TLDR:,php,performance,xdebug,Php,Performance,Xdebug,当Xdebug作为PHP模块加载时,即使完全禁用,也会带来严重的性能损失。[1] 是否可以在没有任何性能开销的情况下加载Xdebug模块? 当然,考虑到它在进行主动调试(通过HTTP请求中存在调试cookie,或在CLI中通过一系列-dxdebug参数启用)或评测时会有性能开销 详细说明: 在运行集成测试套件时,我正在调查性能不佳的问题。运行整个套件需要2分钟。我已经在Xdebug上禁用了所有需要禁用的功能,直到我最终决定从PHP中完全删除模块本身。当我这样做时,集成套件运行了56秒。几乎快了一

当Xdebug作为PHP模块加载时,即使完全禁用,也会带来严重的性能损失。[1]

是否可以在没有任何性能开销的情况下加载Xdebug模块?

当然,考虑到它在进行主动调试(通过HTTP请求中存在调试cookie,或在CLI中通过一系列
-dxdebug
参数启用)或评测时会有性能开销

详细说明: 在运行集成测试套件时,我正在调查性能不佳的问题。运行整个套件需要2分钟。我已经在Xdebug上禁用了所有需要禁用的功能,直到我最终决定从PHP中完全删除模块本身。当我这样做时,集成套件运行了56秒。几乎快了一倍

我开始深入研究,发现这是一个普遍的问题。再次[1]作为参考。以下是我正在使用的设置:

xdebug.remote_autostart         = Off
xdebug.default_enable           = Off
xdebug.profiler_enable_trigger  = Off
xdebug.remote_enable            = Off
xdebug.remote_handler           = dbgp
xdebug.remote_port              = 9000
xdebug.idekey                   = PHPSTORM
xdebug.remote_log               = /var/log/php/xdebug.log
这是PHP/Xdebug版本:

PHP 7.4.2 (cli) (built: Feb  1 2020 19:47:36) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
    with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans
我在PHP CLI中看到了这种差异

[1] 相关的:

  • (几个月前,有人为此打开了一个bug报告,但Xdebug开发人员似乎将此标记为非问题)

    • 好的,我知道了,至少对于PHP CLI是这样

      这将在web请求上禁用Xdebug,但您可以在有Xdebug和没有Xdebug的情况下运行CLI命令。如果您正在编写许多自动化测试,那么它可能是值得的

      首先,完全禁用Xdebug。运行
      php--version
      ,确认您没有看到这样一行“使用Xdebug v2.9.2,版权(c)2002-2020,由Derick Rethans编写”

      然后,运行
      php-i | grep^ extension_dir
      找出php扩展的存储位置。将CD放入该文件夹中,并检查是否可以在那里找到xdebug.so

      现在,使用参数
      -dzend_extension=YOUR_XDEBUG.SO_PATH
      运行
      php
      ,加载XDEBUG。例如:

      php--version

      给出:

      PHP 7.4.2 (cli) (built: Feb  1 2020 19:47:36) ( NTS )
      Copyright (c) The PHP Group
      Zend Engine v3.4.0, Copyright (c) Zend Technologies
          with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
      
      PHP 7.4.2 (cli) (built: Feb  1 2020 19:47:36) ( NTS )
      Copyright (c) The PHP Group
      Zend Engine v3.4.0, Copyright (c) Zend Technologies
          with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
          with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans
      
      php-dzend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so--version

      给出:

      PHP 7.4.2 (cli) (built: Feb  1 2020 19:47:36) ( NTS )
      Copyright (c) The PHP Group
      Zend Engine v3.4.0, Copyright (c) Zend Technologies
          with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
      
      PHP 7.4.2 (cli) (built: Feb  1 2020 19:47:36) ( NTS )
      Copyright (c) The PHP Group
      Zend Engine v3.4.0, Copyright (c) Zend Technologies
          with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
          with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans
      
      在我的例子中,我将其作为一个bash别名,并为更细粒度的控件添加了一些参数:

      alias phpx='PHP_IDE_CONFIG="serverName=someServerNameInPHPStorm" php -dzend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so -dxdebug.remote_autostart=1 -dxdebug.remote_enable=1 -dxdebug.default_enable=1 -dxdebug.remote_connect_back=1 -dxdebug.remote_handler=dbgp -dxdebug.remote_port=9000 -dxdebug.idekey=PHPSTORM -dxdebug.remote_host=127.0.0.1';
      
      所以我像这样使用它:
      phpx run_something.php
      与Xdebug一起运行,而
      php run_something.php
      不使用,以获得最佳性能


      感谢@LazyOne提供的提示,我希望Xdebug能够解决这个性能问题,因为正如我所说的,这个解决方案不适用于web请求。

      好的,我知道了,至少对于PHP CLI是这样

      这将在web请求上禁用Xdebug,但您可以在有Xdebug和没有Xdebug的情况下运行CLI命令。如果您正在编写许多自动化测试,那么它可能是值得的

      首先,完全禁用Xdebug。运行
      php--version
      ,确认您没有看到这样一行“使用Xdebug v2.9.2,版权(c)2002-2020,由Derick Rethans编写”

      然后,运行
      php-i | grep^ extension_dir
      找出php扩展的存储位置。将CD放入该文件夹中,并检查是否可以在那里找到xdebug.so

      现在,使用参数
      -dzend_extension=YOUR_XDEBUG.SO_PATH
      运行
      php
      ,加载XDEBUG。例如:

      php--version

      给出:

      PHP 7.4.2 (cli) (built: Feb  1 2020 19:47:36) ( NTS )
      Copyright (c) The PHP Group
      Zend Engine v3.4.0, Copyright (c) Zend Technologies
          with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
      
      PHP 7.4.2 (cli) (built: Feb  1 2020 19:47:36) ( NTS )
      Copyright (c) The PHP Group
      Zend Engine v3.4.0, Copyright (c) Zend Technologies
          with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
          with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans
      
      php-dzend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so--version

      给出:

      PHP 7.4.2 (cli) (built: Feb  1 2020 19:47:36) ( NTS )
      Copyright (c) The PHP Group
      Zend Engine v3.4.0, Copyright (c) Zend Technologies
          with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
      
      PHP 7.4.2 (cli) (built: Feb  1 2020 19:47:36) ( NTS )
      Copyright (c) The PHP Group
      Zend Engine v3.4.0, Copyright (c) Zend Technologies
          with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
          with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans
      
      在我的例子中,我将其作为一个bash别名,并为更细粒度的控件添加了一些参数:

      alias phpx='PHP_IDE_CONFIG="serverName=someServerNameInPHPStorm" php -dzend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so -dxdebug.remote_autostart=1 -dxdebug.remote_enable=1 -dxdebug.default_enable=1 -dxdebug.remote_connect_back=1 -dxdebug.remote_handler=dbgp -dxdebug.remote_port=9000 -dxdebug.idekey=PHPSTORM -dxdebug.remote_host=127.0.0.1';
      
      所以我像这样使用它:
      phpx run_something.php
      与Xdebug一起运行,而
      php run_something.php
      不使用,以获得最佳性能


      感谢@LazyOne提供的提示,我希望Xdebug能够解决这个性能问题,因为正如我所说的,这个解决方案不适用于web请求。

      使用Xdebug的目的是什么:实际调试还是代码覆盖率报告(例如PHPUnit)?如果第二个--尝试另一个引擎(例如PCOV或PHPDBG)--它们的速度似乎要快得多(如果您的编辑器/IDE支持这一点,例如PhpStorm支持2020.1,即将发布:)。除此之外:只需加载Xdebug模块(而不做任何事情,只需启用以查找可能的“调试我”标志)就会降低代码执行速度,大约2倍(基于我大约4年前的基准测试)。在PHP启动期间,您仍然需要加载Xdebug(特别是当脚本由web服务器提供服务时,您不能像使用CLI脚本那样,仅为该请求传递额外的参数来加载Xdebug)。另外,如果您需要调试并且不想使用任何“调试我”标志(cookie、GET/POST参数等),您可以从PHP代码调用Xdebug--
      Xdebug_break()--将充当编程断点,并将启动调试会话,就像存在“debug me”标志一样。@LazyOne我有Xdebug作为开发和调试工具,当给定某些调试标志时,我想激活它。如果没有提供这些调试标志,我希望它不会对性能造成任何损失。只要加载Xdebug,PHP代码的执行就会减慢。对于CLI脚本,您可以解决这个问题——在需要时使用
      -z
      参数AFAIK动态加载Xdebug(例如,PhpStorm可以做到这一点——当您单击CLI脚本的“Debug”时,它将传递这样的参数)。对于web服务器,由于您不直接启动/控制PHP,您需要手动(或使用一些自动化脚本)在PHP.ini中启用/禁用Xdebug并重新启动web服务器,这并不方便。使用Xdebug的目的是什么:实际调试还是代码覆盖率报告(例如PHPUnit)?如果第二个--尝试另一个引擎(例如PCOV或PHPDBG)--它们似乎更快(如果您的编辑器/IDE支持这一点,例如PhpStorm支持2020.1,即将发布:)。除此之外:只是加载了Xdebug模块(而不做任何事情,只是启用以查看