From da187e7d2edb2b7ccda1e7ceac038b0280070a28 Mon Sep 17 00:00:00 2001 From: Kyrian Obikwelu Date: Sat, 12 Jul 2025 23:05:17 +0100 Subject: [PATCH] fix: make PCNTL extension optional for StdioServerTransport Signal handling now gracefully degrades when PCNTL extension is unavailable or the event loop doesn't support signals. The transport continues to work normally since termination also happens when STDIN closes. --- composer.json | 2 +- src/Transports/StdioServerTransport.php | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 842f591..aed46e4 100644 --- a/composer.json +++ b/composer.json @@ -46,7 +46,7 @@ "symfony/var-dumper": "^6.4.11|^7.1.5" }, "suggest": { - "react/http": "Required for using the ReactPHP HTTP transport handler (^1.11 recommended)." + "ext-pcntl": "For signal handling support when using StdioServerTransport with StreamSelectLoop" }, "autoload": { "psr-4": { diff --git a/src/Transports/StdioServerTransport.php b/src/Transports/StdioServerTransport.php index 011efe6..4535c17 100644 --- a/src/Transports/StdioServerTransport.php +++ b/src/Transports/StdioServerTransport.php @@ -148,12 +148,16 @@ public function listen(): void $this->close(); }); - $signalHandler = function (int $signal) { - $this->logger->info("Received signal {$signal}, shutting down."); - $this->close(); - }; - $this->loop->addSignal(SIGTERM, $signalHandler); - $this->loop->addSignal(SIGINT, $signalHandler); + try { + $signalHandler = function (int $signal) { + $this->logger->info("Received signal {$signal}, shutting down."); + $this->close(); + }; + $this->loop->addSignal(SIGTERM, $signalHandler); + $this->loop->addSignal(SIGINT, $signalHandler); + } catch (Throwable $e) { + $this->logger->debug('Signal handling not supported by current event loop.'); + } $this->logger->info('Server is up and listening on STDIN 🚀');