diff --git a/HttpServer/Events/OnRequest.php b/HttpServer/Events/OnRequest.php index 76705739..0f4dd44e 100644 --- a/HttpServer/Events/OnRequest.php +++ b/HttpServer/Events/OnRequest.php @@ -4,12 +4,15 @@ declare(strict_types=1); namespace HttpServer\Events; +use Annotation\Route\After; use Exception; use HttpServer\Abstracts\Callback; +use HttpServer\Events\Utility\AfterRequest; use HttpServer\Exception\ExitException; use HttpServer\Http\Request as HRequest; use HttpServer\Http\Response as HResponse; use ReflectionException; +use Snowflake\Async; use Snowflake\Core\Json; use Snowflake\Event; use Snowflake\Exception\ComponentException; @@ -36,38 +39,25 @@ class OnRequest extends Callback */ public function onHandler(Request $request, Response $response) { - Coroutine::defer([$this, 'onAfter']); try { - /** @var HRequest $sRequest */ - [$sRequest, $sResponse] = $this->create($request, $response); - if ($sRequest->is('favicon.ico')) { - $sResponse->send($sRequest->isNotFound(), 200); + [$req, $rep] = static::create($request, $response); + if ($req->is('favicon.ico')) { + send(null, 404); } else { - Snowflake::app()->getRouter()->dispatch(); + router()->dispatch(); + } + } catch (ExitException | Error | \Throwable $exception) { + if ($exception instanceof ExitException) { + send($exception->getMessage(), $exception->getCode()); + } else { + $this->sendErrorMessage($exception); } - } catch (ExitException $exception) { - send($exception->getMessage(), $exception->getCode()); - } catch (Error | \Throwable $exception) { - $this->sendErrorMessage($exception); } finally { - $logger = Snowflake::app()->getLogger(); - - $request = get_object_vars($request); - - $logger->write(Json::encode($request), 'request'); + $this->onAfter(); } } - /** - * @throws ComponentException - */ - public function onAfter() - { - fire(Event::EVENT_AFTER_REQUEST); - } - - /** * @param $request * @param $response @@ -75,12 +65,21 @@ class OnRequest extends Callback * @throws NotFindClassException * @throws ReflectionException */ - private function create($request, $response): array + public static function create($request, $response): array { return [HRequest::create($request), HResponse::create($response)]; } + /** + * @throws ComponentException + */ + public function onAfter() + { + fire(Event::EVENT_AFTER_REQUEST); + } + + /** * @param $response * @throws Exception diff --git a/System/Abstracts/BaseApplication.php b/System/Abstracts/BaseApplication.php index e1e8df8d..4c67c3e3 100644 --- a/System/Abstracts/BaseApplication.php +++ b/System/Abstracts/BaseApplication.php @@ -23,6 +23,7 @@ use HttpServer\Service\Receive; use HttpServer\Service\Websocket; use Kafka\Producer; use Annotation\Annotation as SAnnotation; +use Snowflake\Async; use Snowflake\Cache\Redis; use Snowflake\Di\Service; use Snowflake\Error\ErrorHandler; @@ -46,6 +47,7 @@ use Database\DatabasesProviders; * @property \Redis|Redis $redis * @property Server $server * @property DatabasesProviders $db + * @property Async $async * @property Connection $connections * @property Logger $logger * @property Jwt $jwt @@ -391,6 +393,16 @@ abstract class BaseApplication extends Service } + /** + * @return Async + * @throws ComponentException + */ + public function getAsync(): Async + { + return $this->get('async'); + } + + /** * @throws Exception */ @@ -410,6 +422,7 @@ abstract class BaseApplication extends Service 'router' => ['class' => Router::class], 'redis' => ['class' => Redis::class], 'jwt' => ['class' => Jwt::class], + 'async' => ['class' => Async::class], 'goto' => ['class' => BaseGoto::class], 'http2' => ['class' => Http2::class], ]); diff --git a/System/Async.php b/System/Async.php new file mode 100644 index 00000000..e4a2ae8f --- /dev/null +++ b/System/Async.php @@ -0,0 +1,35 @@ +server->getServer(); + if (!isset($server->setting['task_worker_num']) || !class_exists($class)) { + return; + } + + $randWorkerId = random_int(0, $server->setting['task_worker_num'] - 1); + + $server->task(serialize($class), $randWorkerId); + } + +}