From fb5660fe3f8d58871b9b9f980b17324071833502 Mon Sep 17 00:00:00 2001 From: Matthias Neid Date: Wed, 10 Jul 2024 13:51:17 +0200 Subject: [PATCH] detect grpc fork support --- src/Environment/Fork/ForkWorker.php | 20 ++++++++++++++++++++ src/Environment/Process/ProcessWorker.php | 8 ++++++++ src/Taskmaster.php | 5 ++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/Environment/Fork/ForkWorker.php b/src/Environment/Fork/ForkWorker.php index c2381aa..af0bacc 100644 --- a/src/Environment/Fork/ForkWorker.php +++ b/src/Environment/Fork/ForkWorker.php @@ -18,6 +18,26 @@ */ class ForkWorker extends SocketWorker { + /** + * @return bool + */ + public static function isSupported(): bool + { + if (!extension_loaded("pcntl")) { + return false; + } + + // GRPC only supports forks if explicitly enabled using the GRPC_ENABLE_FORK_SUPPORT environment variable + // see https://github.com/grpc/grpc/issues/13412 + // If you don't use GRPC, but have the extension loaded, you can always define your workers manually + // or override the automatic worker selection using the TASKMASTER_WORKER environment variable + if (extension_loaded("grpc") && getenv("GRPC_ENABLE_FORK_SUPPORT") !== "1") { + return false; + } + + return true; + } + /** * @return WorkerInstanceInterface */ diff --git a/src/Environment/Process/ProcessWorker.php b/src/Environment/Process/ProcessWorker.php index fa30bb0..dabcae1 100644 --- a/src/Environment/Process/ProcessWorker.php +++ b/src/Environment/Process/ProcessWorker.php @@ -16,6 +16,14 @@ */ class ProcessWorker extends SocketWorker { + /** + * @return bool + */ + public static function isSupported(): bool + { + return function_exists("proc_open") && PHP_OS_FAMILY !== "Windows"; + } + /** * @return ProcessWorkerInstance */ diff --git a/src/Taskmaster.php b/src/Taskmaster.php index 3f2d152..68ad9c1 100644 --- a/src/Taskmaster.php +++ b/src/Taskmaster.php @@ -340,7 +340,6 @@ protected function getSelectableStreams(): array * * @param SocketInterface|null $socket * @return resource|null - * @noinspection PhpMixedReturnTypeCanBeReducedInspection */ protected function getSelectableReadStreamFromSocket(?SocketInterface $socket): mixed { @@ -463,9 +462,9 @@ public function autoDetectWorkers(int $count, bool $loadFromEnv = true, bool $al } if (!$worker) { - if (extension_loaded("pcntl")) { + if (ForkWorker::isSupported()) { $worker = new ForkWorker(); - } elseif (function_exists("proc_open") && PHP_OS_FAMILY !== "Windows") { + } elseif (ProcessWorker::isSupported()) { $worker = new ProcessWorker(); } else { $worker = new SyncWorker();