Skip to content

Commit

Permalink
Disable xdebug in subprocess when inactive
Browse files Browse the repository at this point in the history
  • Loading branch information
staabm committed Oct 14, 2024
1 parent a82cc05 commit 5062ac3
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 2 deletions.
2 changes: 0 additions & 2 deletions src/Runner/PHPT/PhptTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -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';
}
}

Expand Down
9 changes: 9 additions & 0 deletions src/Util/PHP/DefaultJobRunner.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
use function tempnam;
use function trim;
use function unlink;
use PHPUnit\Runner\CodeCoverage;
use SebastianBergmann\Environment\Runtime;

/**
Expand Down Expand Up @@ -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));
Expand Down
23 changes: 23 additions & 0 deletions tests/end-to-end/event/_files/XdebugIsDisabled.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php declare(strict_types=1);
/*
* This file is part of PHPUnit.
*
* (c) Sebastian Bergmann <sebastian@phpunit.de>
*
* 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'));
}
}
38 changes: 38 additions & 0 deletions tests/end-to-end/event/process-isolation-disable-xdebug.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
--TEST--
Subprocesses auto-disable xdebug when no debugger is attached.
--SKIPIF--
<?php declare(strict_types=1);
if (!extension_loaded('xdebug')) {
print 'skip: Extension xdebug must be loaded.';
} elseif (xdebug_is_debugger_active() === true) {
print 'skip: Debugger must not be attached.';
}

--FILE--
<?php declare(strict_types=1);
$_SERVER['argv'][] = '--do-not-cache-result';
$_SERVER['argv'][] = '--no-configuration';
$_SERVER['argv'][] = '--process-isolation';
$_SERVER['argv'][] = '--debug';
$_SERVER['argv'][] = __DIR__ . '/_files/XdebugIsDisabled.php';

require __DIR__ . '/../../bootstrap.php';

(new PHPUnit\TextUI\Application)->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)

0 comments on commit 5062ac3

Please sign in to comment.