diff --git a/ServerManager.php b/ServerManager.php index de8e33e..055b48b 100644 --- a/ServerManager.php +++ b/ServerManager.php @@ -5,6 +5,7 @@ namespace Server; use Annotation\Inject; use Exception; use Kiri\Abstracts\Config; +use Kiri\Di\Container; use Psr\Container\ContainerInterface; use Kiri\Error\Logger; use Kiri\Exception\ConfigException; @@ -26,7 +27,7 @@ use Server\Handler\OnPipeMessage; use Server\Handler\OnServer; use Server\Handler\OnServerManager; use Server\Handler\OnServerReload; -use Server\Handler\OnServerTask; +use Server\Tasker\OnServerTask; use Server\Handler\OnServerWorker; use Swoole\Http\Server as HServer; use Swoole\Process; @@ -65,7 +66,7 @@ class ServerManager /** - * @var ContainerInterface + * @var Container */ #[Inject(ContainerInterface::class)] public ContainerInterface $container; @@ -246,6 +247,9 @@ class ServerManager * @param int $port * @param int $mode * @param array $settings + * @throws ConfigException + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface * @throws Exception */ private function addNewListener(string $type, string $host, int $port, int $mode, array $settings = []) @@ -279,8 +283,10 @@ class ServerManager * @param int $port * @param int $mode * @param array $settings - * @throws ReflectionException * @throws ConfigException + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + * @throws ReflectionException * @throws Exception */ private function createBaseServer(string $type, string $host, int $port, int $mode, array $settings = []) @@ -320,8 +326,9 @@ class ServerManager /** * @param array $settings + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface * @throws ReflectionException - * @throws Exception */ private function addDefaultListener(array $settings): void { @@ -336,12 +343,13 @@ class ServerManager } - /** - * @param array $events - * @param Server|Port $server - * @throws ContainerExceptionInterface - * @throws NotFoundExceptionInterface - */ + /** + * @param array $events + * @param Server|Port $server + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + * @throws ReflectionException + */ private function addServiceEvents(array $events, Server|Port $server) { foreach ($events as $name => $event) { @@ -426,10 +434,12 @@ class ServerManager /** * @param array|null $settings + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + * @throws ReflectionException */ public function bindCallback(?array $settings = []) { - // TODO: Implement bindCallback() method. if (count($settings) < 1) { return; } diff --git a/Tasker/AsyncTask.php b/Tasker/AsyncTask.php new file mode 100644 index 0000000..f3c0b74 --- /dev/null +++ b/Tasker/AsyncTask.php @@ -0,0 +1,65 @@ +server->setting['worker_num']) { + $workerId = random_int($this->server->setting['worker_num'] + 1, + $this->server->setting['worker_num'] + 1 + $this->server->setting['task_worker_num']); + } + if (is_string($handler)) { + $handler = $this->handle($handler, $params); + } + $this->server->task(serialize($handler), $workerId); + } + + + /** + * @param $handler + * @param $params + * @return object + * @throws \ReflectionException + * @throws Exception + */ + private function handle($handler, $params): object + { + $implements = $this->container->getReflect($handler); + if (!in_array(OnTaskInterface::class, $implements->getInterfaceNames())) { + throw new Exception('Task must instance ' . OnTaskInterface::class); + } + return $implements->newInstanceArgs($params); + } + + +} diff --git a/Handler/OnServerTask.php b/Tasker/OnServerTask.php similarity index 83% rename from Handler/OnServerTask.php rename to Tasker/OnServerTask.php index b43bc35..8e7b57b 100644 --- a/Handler/OnServerTask.php +++ b/Tasker/OnServerTask.php @@ -1,13 +1,12 @@ getReflect($class); - - if (!$reflect->isInstantiable()) { - return null; + $execute = unserialize($data); + if ($execute instanceof OnTaskInterface) { + return $execute->execute(); } - $class = $reflect->newInstanceArgs($params); - return $class->execute(); + return null; }