diff --git a/src/Symfony/Component/Console/CHANGELOG.md b/src/Symfony/Component/Console/CHANGELOG.md index 3428a57de359..62972ce961b0 100644 --- a/src/Symfony/Component/Console/CHANGELOG.md +++ b/src/Symfony/Component/Console/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +6.4 +--- + + * Add `SignalMap` to map signal value to its name + 6.3 --- diff --git a/src/Symfony/Component/Console/SignalRegistry/SignalMap.php b/src/Symfony/Component/Console/SignalRegistry/SignalMap.php new file mode 100644 index 000000000000..de419bda7982 --- /dev/null +++ b/src/Symfony/Component/Console/SignalRegistry/SignalMap.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\SignalRegistry; + +/** + * @author Grégoire Pineau + */ +class SignalMap +{ + private static array $map; + + public static function getSignalName(int $signal): ?string + { + if (!\extension_loaded('pcntl')) { + return null; + } + + if (!isset(self::$map)) { + $r = new \ReflectionExtension('pcntl'); + $c = $r->getConstants(); + $map = array_filter($c, fn ($k) => str_starts_with($k, 'SIG') && !str_starts_with($k, 'SIG_'), \ARRAY_FILTER_USE_KEY); + self::$map = array_flip($map); + } + + return self::$map[$signal] ?? null; + } +} diff --git a/src/Symfony/Component/Console/Tests/SignalRegistry/SignalMapTest.php b/src/Symfony/Component/Console/Tests/SignalRegistry/SignalMapTest.php new file mode 100644 index 000000000000..887c5d7af01c --- /dev/null +++ b/src/Symfony/Component/Console/Tests/SignalRegistry/SignalMapTest.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Tests\SignalRegistry; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Console\SignalRegistry\SignalMap; + +class SignalMapTest extends TestCase +{ + /** + * @requires extension pcntl + * + * @testWith [2, "SIGINT"] + * [9, "SIGKILL"] + * [15, "SIGTERM"] + */ + public function testSignalExists(int $signal, string $expected) + { + $this->assertSame($expected, SignalMap::getSignalName($signal)); + } + + public function testSignalDoesNotExist() + { + $this->assertNull(SignalMap::getSignalName(999999)); + } +}