This commit is contained in:
2021-01-04 18:21:37 +08:00
parent 4c8e81f417
commit aa7b663967
3 changed files with 72 additions and 25 deletions
+22 -23
View File
@@ -4,12 +4,15 @@ declare(strict_types=1);
namespace HttpServer\Events; namespace HttpServer\Events;
use Annotation\Route\After;
use Exception; use Exception;
use HttpServer\Abstracts\Callback; use HttpServer\Abstracts\Callback;
use HttpServer\Events\Utility\AfterRequest;
use HttpServer\Exception\ExitException; use HttpServer\Exception\ExitException;
use HttpServer\Http\Request as HRequest; use HttpServer\Http\Request as HRequest;
use HttpServer\Http\Response as HResponse; use HttpServer\Http\Response as HResponse;
use ReflectionException; use ReflectionException;
use Snowflake\Async;
use Snowflake\Core\Json; use Snowflake\Core\Json;
use Snowflake\Event; use Snowflake\Event;
use Snowflake\Exception\ComponentException; use Snowflake\Exception\ComponentException;
@@ -36,38 +39,25 @@ class OnRequest extends Callback
*/ */
public function onHandler(Request $request, Response $response) public function onHandler(Request $request, Response $response)
{ {
Coroutine::defer([$this, 'onAfter']);
try { try {
/** @var HRequest $sRequest */ [$req, $rep] = static::create($request, $response);
[$sRequest, $sResponse] = $this->create($request, $response); if ($req->is('favicon.ico')) {
if ($sRequest->is('favicon.ico')) { send(null, 404);
$sResponse->send($sRequest->isNotFound(), 200);
} else { } else {
Snowflake::app()->getRouter()->dispatch(); router()->dispatch();
} }
} catch (ExitException $exception) { } catch (ExitException | Error | \Throwable $exception) {
if ($exception instanceof ExitException) {
send($exception->getMessage(), $exception->getCode()); send($exception->getMessage(), $exception->getCode());
} catch (Error | \Throwable $exception) { } else {
$this->sendErrorMessage($exception); $this->sendErrorMessage($exception);
}
} finally { } finally {
$logger = Snowflake::app()->getLogger(); $this->onAfter();
$request = get_object_vars($request);
$logger->write(Json::encode($request), 'request');
} }
} }
/**
* @throws ComponentException
*/
public function onAfter()
{
fire(Event::EVENT_AFTER_REQUEST);
}
/** /**
* @param $request * @param $request
* @param $response * @param $response
@@ -75,12 +65,21 @@ class OnRequest extends Callback
* @throws NotFindClassException * @throws NotFindClassException
* @throws ReflectionException * @throws ReflectionException
*/ */
private function create($request, $response): array public static function create($request, $response): array
{ {
return [HRequest::create($request), HResponse::create($response)]; return [HRequest::create($request), HResponse::create($response)];
} }
/**
* @throws ComponentException
*/
public function onAfter()
{
fire(Event::EVENT_AFTER_REQUEST);
}
/** /**
* @param $response * @param $response
* @throws Exception * @throws Exception
+13
View File
@@ -23,6 +23,7 @@ use HttpServer\Service\Receive;
use HttpServer\Service\Websocket; use HttpServer\Service\Websocket;
use Kafka\Producer; use Kafka\Producer;
use Annotation\Annotation as SAnnotation; use Annotation\Annotation as SAnnotation;
use Snowflake\Async;
use Snowflake\Cache\Redis; use Snowflake\Cache\Redis;
use Snowflake\Di\Service; use Snowflake\Di\Service;
use Snowflake\Error\ErrorHandler; use Snowflake\Error\ErrorHandler;
@@ -46,6 +47,7 @@ use Database\DatabasesProviders;
* @property \Redis|Redis $redis * @property \Redis|Redis $redis
* @property Server $server * @property Server $server
* @property DatabasesProviders $db * @property DatabasesProviders $db
* @property Async $async
* @property Connection $connections * @property Connection $connections
* @property Logger $logger * @property Logger $logger
* @property Jwt $jwt * @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 * @throws Exception
*/ */
@@ -410,6 +422,7 @@ abstract class BaseApplication extends Service
'router' => ['class' => Router::class], 'router' => ['class' => Router::class],
'redis' => ['class' => Redis::class], 'redis' => ['class' => Redis::class],
'jwt' => ['class' => Jwt::class], 'jwt' => ['class' => Jwt::class],
'async' => ['class' => Async::class],
'goto' => ['class' => BaseGoto::class], 'goto' => ['class' => BaseGoto::class],
'http2' => ['class' => Http2::class], 'http2' => ['class' => Http2::class],
]); ]);
+35
View File
@@ -0,0 +1,35 @@
<?php
namespace Snowflake;
use Exception;
use HttpServer\IInterface\Task;
use Snowflake\Abstracts\Component;
/**
* Class Async
* @package Snowflake
*/
class Async extends Component
{
/**
* @param Task $class
* @throws Exception
*/
public function dispatch(Task $class)
{
$server = Snowflake::app()->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);
}
}