diff --git a/HttpServer/Events/OnWorkerStart.php b/HttpServer/Events/OnWorkerStart.php index 59c29377..781ccd60 100644 --- a/HttpServer/Events/OnWorkerStart.php +++ b/HttpServer/Events/OnWorkerStart.php @@ -40,25 +40,7 @@ class OnWorkerStart extends Callback $annotation = Snowflake::app()->getAnnotation(); $annotation->setLoader(unserialize($runtime)); - putenv('state=start'); - putenv('worker=' . $this->server->worker_id); - - $pipeLine = new Pipeline(); - $pipeLine->if($isWorker, function ($annotation, $server) { - $annotation->runtime(CONTROLLER_PATH); - $annotation->runtime(APP_PATH, CONTROLLER_PATH); - - name($server->worker_pid, 'Worker.' . $server->worker_id); - }) - ->else(function ($annotation, $server) { - $annotation->runtime(MODEL_PATH); - - name($server->worker_pid, 'Task.' . $server->worker_id); - }) - ->catch(function (\Throwable $throwable) { - $this->addError($throwable->getMessage()); - }) - ->exec($annotation, $this->server); + return $annotation; } @@ -71,15 +53,27 @@ class OnWorkerStart extends Callback */ public function onHandler(Server $server, int $worker_id): void { - $this->server = $server; - - $this->injectLoader($this->isWorker($worker_id)); - - if ($worker_id < $server->setting['worker_num']) { - $this->onWorker($server, $worker_id); - } else { - $this->onTask($server, $worker_id); - } + $annotation = $this->injectLoader(); + (new Pipeline()) + ->if($this->isWorker($worker_id), function ($annotation, $server, $worker_id) { + $annotation->runtime(CONTROLLER_PATH); + $annotation->runtime(APP_PATH, CONTROLLER_PATH); + $this->onWorker($server, $server->worker_id); + name($server->worker_pid, 'Worker.' . $worker_id); + }) + ->else(function ($annotation, $server, $worker_id) { + $annotation->runtime(MODEL_PATH); + $this->onTask($server, $server->worker_id); + name($server->worker_pid, 'Task.' . $worker_id); + }) + ->catch(function (\Throwable $throwable) { + $this->addError($throwable->getMessage()); + }) + ->before(function ($annotation, $server, $worker_id) { + putenv('state=start'); + putenv('worker=' . $worker_id); + }) + ->exec($annotation, $server, $worker_id); } diff --git a/HttpServer/Events/Pipeline.php b/HttpServer/Events/Pipeline.php index 73b40ce8..8735dca9 100644 --- a/HttpServer/Events/Pipeline.php +++ b/HttpServer/Events/Pipeline.php @@ -10,6 +10,8 @@ class Pipeline private \Closure $_if; private \Closure $_else; private \Closure $_catch; + private \Closure $_after; + private \Closure $_before; private bool $condition; @@ -48,6 +50,26 @@ class Pipeline return $this; } + /** + * @param \Closure $handler + * @return $this + */ + public function after(\Closure $handler): static + { + $this->_after = $handler; + return $this; + } + + /** + * @param \Closure $handler + * @return $this + */ + public function before(\Closure $handler): static + { + $this->_before = $handler; + return $this; + } + /** * @param $argv @@ -56,16 +78,18 @@ class Pipeline public function exec(...$argv) { try { + call_user_func($this->_before, ...$argv); if ($this->condition !== true) { call_user_func($this->_else, ...$argv); } else { call_user_func($this->_if, ...$argv); } - var_dump(__METHOD__); return $argv; } catch (\Throwable $exception) { call_user_func($this->_catch, $exception); return $argv; + } finally { + call_user_func($this->_after, ...$argv); } }