diff --git a/src/Runner/PHPT/PhptTestCase.php b/src/Runner/PHPT/PhptTestCase.php index 185bb917bb8..0eecc635043 100644 --- a/src/Runner/PHPT/PhptTestCase.php +++ b/src/Runner/PHPT/PhptTestCase.php @@ -906,8 +906,6 @@ private function settings(bool $collectCoverage): array if (extension_loaded('xdebug')) { if ($collectCoverage) { $settings[] = 'xdebug.mode=coverage'; - } else { - $settings[] = 'xdebug.mode=off'; } } diff --git a/src/Util/PHP/DefaultJobRunner.php b/src/Util/PHP/DefaultJobRunner.php index 5738423f588..43ebf472499 100644 --- a/src/Util/PHP/DefaultJobRunner.php +++ b/src/Util/PHP/DefaultJobRunner.php @@ -27,6 +27,7 @@ use function tempnam; use function trim; use function unlink; +use PHPUnit\Runner\CodeCoverage; use SebastianBergmann\Environment\Runtime; /** @@ -184,6 +185,14 @@ private function buildCommand(Job $job, ?string $file): array array_keys($xdebugSettings), ), ); + + // disable xdebug if not required to reduce xdebug performance overhead in subprocesses + if ( + !CodeCoverage::instance()->isActive() && + xdebug_is_debugger_active() === false + ) { + $phpSettings['xdebug.mode'] = 'xdebug.mode=off'; + } } $command = array_merge($command, $this->settingsToParameters($phpSettings)); diff --git a/tests/end-to-end/event/_files/XdebugIsDisabled.php b/tests/end-to-end/event/_files/XdebugIsDisabled.php new file mode 100644 index 00000000000..e2cb32d2e92 --- /dev/null +++ b/tests/end-to-end/event/_files/XdebugIsDisabled.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TestFixture\Event; + +use function extension_loaded; +use function ini_get; +use PHPUnit\Framework\TestCase; + +final class XdebugIsDisabled extends TestCase +{ + public function testOne(): void + { + $this->assertTrue(extension_loaded('xdebug')); + $this->assertSame('', (string) ini_get('xdebug.mode')); + } +} diff --git a/tests/end-to-end/event/process-isolation-disable-xdebug.phpt b/tests/end-to-end/event/process-isolation-disable-xdebug.phpt new file mode 100644 index 00000000000..9794d16fa73 --- /dev/null +++ b/tests/end-to-end/event/process-isolation-disable-xdebug.phpt @@ -0,0 +1,38 @@ +--TEST-- +Subprocesses auto-disable xdebug when no debugger is attached. +--SKIPIF-- +run($_SERVER['argv']); +--EXPECTF-- +PHPUnit Started (PHPUnit %s using %s) +Test Runner Configured +Event Facade Sealed +Test Suite Loaded (1 test) +Test Runner Started +Test Suite Sorted +Test Runner Execution Started (1 test) +Test Suite Started (PHPUnit\TestFixture\Event\XdebugIsDisabled, 1 test) +Test Preparation Started (PHPUnit\TestFixture\Event\XdebugIsDisabled::testOne) +Test Prepared (PHPUnit\TestFixture\Event\XdebugIsDisabled::testOne) +Test Passed (PHPUnit\TestFixture\Event\XdebugIsDisabled::testOne) +Test Finished (PHPUnit\TestFixture\Event\XdebugIsDisabled::testOne) +Test Suite Finished (PHPUnit\TestFixture\Event\XdebugIsDisabled, 1 test) +Test Runner Execution Finished +Test Runner Finished +PHPUnit Finished (Shell Exit Code: 0)