diff --git a/Annotation/Route/Socket.php b/Annotation/Route/Socket.php index 66c8d0d8..629ac1c9 100644 --- a/Annotation/Route/Socket.php +++ b/Annotation/Route/Socket.php @@ -7,10 +7,6 @@ namespace Annotation\Route; use Annotation\Attribute; use Exception; use HttpServer\Route\Router; -use ReflectionException; -use Snowflake\Exception\ComponentException; -use Snowflake\Exception\ConfigException; -use Snowflake\Exception\NotFindClassException; use Snowflake\Snowflake; /** @@ -30,21 +26,18 @@ use Snowflake\Snowflake; * @param string|null $uri * @param string $version */ - public function __construct( - public string $event, - public ?string $uri = null, - public string $version = 'v.1.0' - ) + public function __construct(public string $event, public ?string $uri = null, public string $version = 'v.1.0') { } /** - * @param array $handler + * @param mixed $class + * @param mixed|null $method * @return Router * @throws Exception */ - public function execute(mixed $class, mixed $method = null): Router + public function execute(mixed $class, mixed $method = null): Router { // TODO: Implement setHandler() method. $router = Snowflake::app()->getRouter(); diff --git a/HttpServer/Abstracts/Callback.php b/HttpServer/Abstracts/Callback.php index 4ee90e96..c55fe51e 100644 --- a/HttpServer/Abstracts/Callback.php +++ b/HttpServer/Abstracts/Callback.php @@ -6,20 +6,10 @@ namespace HttpServer\Abstracts; use Database\Connection; use Exception; -use HttpServer\Http\Request; -use PHPMailer\PHPMailer\PHPMailer; -use PHPMailer\PHPMailer\SMTP; -use ReflectionException; use Snowflake\Abstracts\Config; -use Snowflake\Core\Json; -use Snowflake\Error\LoggerProcess; use Snowflake\Event; -use Snowflake\Exception\ComponentException; use Snowflake\Exception\ConfigException; -use Snowflake\Exception\NotFindClassException; use Snowflake\Snowflake; -use Swoole\Process; -use Swoole\Server; /** @@ -30,116 +20,89 @@ abstract class Callback extends HttpService { - - const EVENT_ERROR = 'WORKER:ERROR'; - const EVENT_STOP = 'WORKER:STOP'; - const EVENT_EXIT = 'WORKER:EXIT'; + const EVENT_ERROR = 'WORKER:ERROR'; + const EVENT_STOP = 'WORKER:STOP'; + const EVENT_EXIT = 'WORKER:EXIT'; - private array $_MESSAGE = [ - self::EVENT_ERROR => 'The server error. at No.', - self::EVENT_STOP => 'The server stop. at No.', - self::EVENT_EXIT => 'The server exit. at No.', - ]; - - - - /** - * @return PHPMailer - * @throws \PHPMailer\PHPMailer\Exception - * @throws ConfigException - */ - private function createEmail(): PHPMailer - { - $mail = new PHPMailer(true); - $mail->SMTPDebug = SMTP::DEBUG_SERVER; // Enable verbose debug output - $mail->isSMTP(); // Send using SMTP - $mail->Host = Config::get('email.host'); // Set the SMTP server to send through - $mail->SMTPAuth = true; // Enable SMTP authentication - $mail->Debugoutput = false; // Enable SMTP authentication - $mail->CharSet = "UTF8"; // Enable SMTP authentication - $mail->Username = Config::get('email.username'); // SMTP username - $mail->Password = Config::get('email.password'); // SMTP password - $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged - $mail->Port = Config::get('email.port'); // TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` above - $mail->setFrom(Config::get('email.send.address'), Config::get('email.send.nickname')); - return $mail; - } - - - /** - * @param $fd - * @param $data - * @param $reID - * @return Request - * @throws Exception - */ - protected function _request($fd, $data, $reID): Request - { - return Request::createListenRequest($fd, $data, $reID); - } + private array $_MESSAGE = [ + self::EVENT_ERROR => 'The server error. at No.', + self::EVENT_STOP => 'The server stop. at No.', + self::EVENT_EXIT => 'The server exit. at No.', + ]; /** * @param $messageContent * @throws Exception */ - protected function system_mail($messageContent) - { - try { - $email = Config::get('email'); - if (empty($email) || !$email['enable']) { - return; - } - $transport = (new \Swift_SmtpTransport($email['host'], $email['465'])) - ->setUsername($email['username']) - ->setPassword($email['password']); - $mailer = new \Swift_Mailer($transport); + protected function system_mail($messageContent) + { + try { + $email = Config::get('email'); + if (empty($email) || !$email['enable']) { + return; + } + $transport = (new \Swift_SmtpTransport($email['host'], $email['465'])) + ->setUsername($email['username']) + ->setPassword($email['password']); + $mailer = new \Swift_Mailer($transport); - // Create a message - $message = (new \Swift_Message('Wonderful Subject')) - ->setFrom([$email['send']['address'] => $email['send']['nickname']]) - ->setBody('Here is the message itself'); + // Create a message + $message = (new \Swift_Message('Wonderful Subject')) + ->setFrom([$email['send']['address'] => $email['send']['nickname']]) + ->setBody('Here is the message itself'); - foreach ($email['receive'] as $item) { - $message->setTo([$item['address'], $item['address'] => $item['nickname']]); - } - $mailer->send($messageContent); - } catch (\Throwable $e) { - $this->addError($e, 'email'); - } - } + foreach ($email['receive'] as $item) { + $message->setTo([$item['address'], $item['address'] => $item['nickname']]); + } + $mailer->send($messageContent); + } catch (\Throwable $e) { + $this->addError($e, 'email'); + } + } - /** - * @throws ConfigException - * @throws Exception - */ - protected function clearMysqlClient() - { - $databases = Config::get('databases', []); - if (empty($databases)) { - return; - } - $application = Snowflake::app(); - foreach ($databases as $name => $database) { - /** @var Connection $connection */ - $connection = $application->get('databases.' . $name, false); - if (empty($connection)) { - continue; - } - $connection->disconnect(); - } - } + /** + * @throws ConfigException + * @throws Exception + */ + protected function clearMysqlClient() + { + $databases = Config::get('databases', []); + if (empty($databases)) { + return; + } + $application = Snowflake::app(); + foreach ($databases as $name => $database) { + /** @var Connection $connection */ + $connection = $application->get('databases.' . $name, false); + if (empty($connection)) { + continue; + } + $connection->disconnect(); + } + } - /** - * @throws ConfigException - * @throws Exception - */ - protected function clearRedisClient() - { - $redis = Snowflake::app()->getRedis(); - $redis->destroy(); - } + /** + * @param array $clientInfo + * @param string $event + * @return string + */ + protected function getName(array $clientInfo, string $event): string + { + return 'listen ' . $clientInfo['server_port'] . ' ' . Event::SERVER_CONNECT; + } + + + /** + * @throws ConfigException + * @throws Exception + */ + protected function clearRedisClient() + { + $redis = Snowflake::app()->getRedis(); + $redis->destroy(); + } } diff --git a/HttpServer/Events/OnClose.php b/HttpServer/Events/OnClose.php index 386f2628..9525e7c8 100644 --- a/HttpServer/Events/OnClose.php +++ b/HttpServer/Events/OnClose.php @@ -7,7 +7,6 @@ namespace HttpServer\Events; use Exception; use HttpServer\Abstracts\Callback; use Snowflake\Event; -use Snowflake\Snowflake; use Swoole\Server; /** @@ -19,33 +18,21 @@ class OnClose extends Callback { - /** - * @param Server $server - * @param int $fd - * @throws Exception - */ - public function onHandler(Server $server, int $fd) - { - try { - defer(fn() => fire(Event::SYSTEM_RESOURCE_RELEASES)); - $clientInfo = $server->getClientInfo($fd); - if (!Event::exists(($name = $this->getName($clientInfo)))) { - return; - } - Event::trigger($name, [$server, $fd]); - } catch (\Throwable $exception) { - $this->addError($exception, 'throwable'); - } - } + /** + * @param Server $server + * @param int $fd + * @throws Exception + */ + public function onHandler(Server $server, int $fd) + { + try { + defer(fn() => fire(Event::SYSTEM_RESOURCE_RELEASES)); + $clientInfo = $server->getClientInfo($fd); - - /** - * @param $server_port - * @return string - */ - private function getName($server_port): string - { - return 'listen ' . $server_port['server_port'] . ' ' . Event::SERVER_CLIENT_CLOSE; - } + Event::trigger($this->getName($clientInfo, Event::SERVER_CLIENT_CLOSE), [$server, $fd]); + } catch (\Throwable $exception) { + $this->addError($exception, 'throwable'); + } + } } diff --git a/HttpServer/Events/OnConnect.php b/HttpServer/Events/OnConnect.php index 728f52f5..704d0b10 100644 --- a/HttpServer/Events/OnConnect.php +++ b/HttpServer/Events/OnConnect.php @@ -33,21 +33,11 @@ class OnConnect extends Callback if (isset($clientInfo['websocket_status'])) { return; } - fire($this->getName($clientInfo), [$server, $fd, $reactorId]); + fire($this->getName($clientInfo, Event::SERVER_CONNECT), [$server, $fd, $reactorId]); } catch (\Throwable $throwable) { $this->addError($throwable, 'connect'); } } - /** - * @param array $clientInfo - * @return string - */ - private function getName(array $clientInfo): string - { - return 'listen ' . $clientInfo['server_port'] . ' ' . Event::SERVER_CONNECT; - } - - } diff --git a/HttpServer/Events/OnHandshake.php b/HttpServer/Events/OnHandshake.php index 42b396eb..566ebee5 100644 --- a/HttpServer/Events/OnHandshake.php +++ b/HttpServer/Events/OnHandshake.php @@ -11,6 +11,7 @@ use HttpServer\Http\HttpHeaders; use HttpServer\Http\HttpParams; use HttpServer\Http\Request; use HttpServer\Http\Response; +use HttpServer\Route\Router; use ReflectionException; use Snowflake\Core\ArrayAccess; use Snowflake\Event; @@ -29,130 +30,106 @@ class OnHandshake extends Callback { - /** - * @param $request - * @param $response - * @throws Exception - */ - private function resolveParse($request, $response) - { - /** @var Server $server */ - $secWebSocketKey = $request->header['sec-websocket-key']; - $patten = '#^[+/0-9A-Za-z]{21}[AQgw]==$#'; - if (0 === preg_match($patten, $secWebSocketKey) || 16 !== strlen(base64_decode($secWebSocketKey))) { - throw new Exception('protocol error.', 500); - } - $key = base64_encode(sha1($request->header['sec-websocket-key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', TRUE)); - $headers = [ - 'Upgrade' => 'websocket', - 'Connection' => 'Upgrade', - 'Sec-websocket-Accept' => $key, - 'Sec-websocket-Version' => '13', - ]; - if (isset($request->header['sec-websocket-protocol'])) { - $headers['Sec-websocket-Protocol'] = $request->header['sec-websocket-protocol']; - } - foreach ($headers as $key => $val) { - $response->header($key, $val); - } - } + /** + * @param $request + * @param $response + * @return Router + * @throws Exception + */ + private function _protocol($request, $response): Router + { + /** @var Server $server */ + $secWebSocketKey = $request->header['sec-websocket-key']; + $patten = '#^[+/0-9A-Za-z]{21}[AQgw]==$#'; + if (0 === preg_match($patten, $secWebSocketKey) || 16 !== strlen(base64_decode($secWebSocketKey))) { + throw new Exception('protocol error.', 500); + } + $key = base64_encode(sha1($request->header['sec-websocket-key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', TRUE)); + $headers = [ + 'Upgrade' => 'websocket', + 'Connection' => 'Upgrade', + 'Sec-websocket-Accept' => $key, + 'Sec-websocket-Version' => '13', + ]; + if (isset($request->header['sec-websocket-protocol'])) { + $headers['Sec-websocket-Protocol'] = $request->header['sec-websocket-protocol']; + } + foreach ($headers as $key => $val) { + $response->header($key, $val); + } + return Snowflake::app()->getRouter(); + } - /** - * @param SResponse $response - * @param int $code - * @return false - */ - private function disconnect(SResponse $response, $code = 500): bool - { - $server = Snowflake::getWebSocket(); - if (!$server->exist($response->fd)) { - return false; - } - $response->status($code); - $response->end(); - return false; - } + /** + * @param SResponse $response + * @param int $code + * @return void + */ + private function disconnect(SResponse $response, int $code = 500): void + { + $server = Snowflake::getWebSocket(); + if (!$server->isEstablished($response->fd)) { + return; + } + $response->status($code); + $response->end(); + } - /** - * @param $response - * @param int $code - * @return false - */ - private function connect($response, $code = 101): bool - { - $response->status($code); - $response->end(); - return false; - } + /** + * @param SRequest $request + * @param SResponse $response + * @return void + * @throws Exception + */ + public function onHandler(SRequest $request, SResponse $response): void + { + try { + defer(fn() => fire(Event::SYSTEM_RESOURCE_RELEASES)); + + $router = $this->_protocol($request, $response); + + [$sRequest, $sResponse] = $this->sRequest($request, $response); + + if (($node = $router->find_path($sRequest)) !== null) { + $node->dispatch($sRequest, $sResponse); + } else { + $this->disconnect($response, 404); + } + } catch (\Throwable $exception) { + $this->addError($exception, 'throwable'); + $response->status(500); + $response->end($exception->getMessage()); + } + } - /** - * @param SRequest $request - * @param SResponse $response - * @return void - * @throws Exception - */ - public function onHandler(SRequest $request, SResponse $response): void - { - try { - defer(fn() => fire(Event::SYSTEM_RESOURCE_RELEASES)); + /** + * @param $request + * @param SResponse $response + * @return array + * @throws NotFindClassException + * @throws ReflectionException + * @throws Exception + */ + private function sRequest($request, SResponse $response): array + { + /** @var Request $sRequest */ + $sRequest = Request::create($request); + $sRequest->uri = '/' . Socket::HANDSHAKE . '::event'; - $this->execute($request, $response); - } catch (\Throwable $exception) { - $this->addError($exception, 'throwable'); - $response->status(500); - $response->end($exception->getMessage()); - } - } + $sRequest->headers = new HttpHeaders(ArrayAccess::merge($request->server, $request->header)); + $sRequest->headers->replace('request_method', 'sw::socket'); + $sRequest->headers->replace('request_uri', $sRequest->uri); - /** - * @param SRequest $request - * @param SResponse $response - * @return mixed - * @throws Exception - */ - private function execute(SRequest $request, SResponse $response): mixed - { - $this->resolveParse($request, $response); + $sRequest->params = new HttpParams([], $request->get, []); - $router = Snowflake::app()->getRouter(); + $sRequest->parseUri(); - [$sRequest, $sResponse] = $this->sRequest($request, $response); - - if (($node = $router->find_path($sRequest)) !== null) { - return $node->dispatch($sRequest, $sResponse); - } - return $this->disconnect($response, 404); - } - - - /** - * @param $request - * @param SResponse $response - * @return array - * @throws NotFindClassException - * @throws ReflectionException - */ - private function sRequest($request, SResponse $response): array - { - /** @var Request $sRequest */ - $sRequest = Request::create($request); - $sRequest->uri = '/' . Socket::HANDSHAKE . '::event'; - - $sRequest->headers = new HttpHeaders(ArrayAccess::merge($request->server, $request->header)); - - $sRequest->headers->replace('request_method', 'sw::socket'); - $sRequest->headers->replace('request_uri', $sRequest->uri); - - $sRequest->params = new HttpParams([], $request->get, []); - - $sRequest->parseUri(); - - return [$sRequest, Response::create($response)]; - } + return [$sRequest, Response::create($response)]; + } } diff --git a/HttpServer/Events/OnManagerStop.php b/HttpServer/Events/OnManagerStop.php index 8e6d4af0..4be6717a 100644 --- a/HttpServer/Events/OnManagerStop.php +++ b/HttpServer/Events/OnManagerStop.php @@ -18,7 +18,7 @@ class OnManagerStop extends Callback { /** - * @param $server + * @param Server $server * @throws Exception */ public function onHandler(Server $server) diff --git a/HttpServer/Events/OnMessage.php b/HttpServer/Events/OnMessage.php index d9a824ad..4d41f4d5 100644 --- a/HttpServer/Events/OnMessage.php +++ b/HttpServer/Events/OnMessage.php @@ -4,22 +4,8 @@ declare(strict_types=1); namespace HttpServer\Events; -use Annotation\Route\Socket; -use Exception; use HttpServer\Abstracts\Callback; -use HttpServer\Http\Context; -use HttpServer\Http\HttpHeaders; -use HttpServer\Http\HttpParams; -use HttpServer\Http\Request; -use ReflectionException; -use Snowflake\Abstracts\Config; -use Snowflake\Core\Json; use Snowflake\Event; -use Snowflake\Exception\ComponentException; -use Snowflake\Exception\ConfigException; -use Snowflake\Exception\NotFindClassException; -use Snowflake\Snowflake; -use Swoole\Coroutine; use Swoole\WebSocket\Frame; use Swoole\WebSocket\Server; @@ -30,38 +16,29 @@ use Swoole\WebSocket\Server; class OnMessage extends Callback { - /** - * @param Server $server - * @param Frame $frame - * @throws - */ - public function onHandler(Server $server, Frame $frame) - { - try { - defer(fn() => fire(Event::SYSTEM_RESOURCE_RELEASES)); - if ($frame->opcode === 0x08) { - return; - } - Event::trigger($this->getName($server, $frame), [$frame, $server]); - } catch (\Throwable $exception) { - $this->addError($exception, 'websocket'); - if (!swoole()->isEstablished($frame->fd)) { - return; - } - $server->send($frame->fd, $exception->getMessage()); - } - } + /** + * @param Server $server + * @param Frame $frame + * @throws + */ + public function onHandler(Server $server, Frame $frame) + { + try { + defer(fn() => fire(Event::SYSTEM_RESOURCE_RELEASES)); + if ($frame->opcode === 0x08) { + return; + } + $clientInfo = $this->getName($server->getClientInfo($frame->fd), Event::SERVER_MESSAGE); - /** - * @param $clientInfo - * @return string - */ - private function getName(Server $server, Frame $frame): string - { - $clientInfo = $server->getClientInfo($frame->fd); - - return 'listen ' . $clientInfo['server_port'] . ' ' . Event::SERVER_MESSAGE; - } + Event::trigger($clientInfo, [$frame, $server]); + } catch (\Throwable $exception) { + $this->addError($exception, 'websocket'); + if (!swoole()->isEstablished($frame->fd)) { + return; + } + $server->send($frame->fd, $exception->getMessage()); + } + } } diff --git a/HttpServer/Events/OnPacket.php b/HttpServer/Events/OnPacket.php index 7dc090a9..b9b4bfcc 100644 --- a/HttpServer/Events/OnPacket.php +++ b/HttpServer/Events/OnPacket.php @@ -8,7 +8,6 @@ use Exception; use HttpServer\Abstracts\Callback; use Snowflake\Core\Json; use Snowflake\Event; -use Snowflake\Snowflake; use Swoole\Server; /** @@ -18,45 +17,30 @@ use Swoole\Server; class OnPacket extends Callback { - - public int $port = 0; - - - public string $host = ''; - - /** * @param Server $server - * @param $data - * @param $clientInfo + * @param string $data + * @param array $client * @return mixed * @throws Exception */ - public function onHandler(Server $server, string $data, array $clientInfo): mixed + public function onHandler(Server $server, string $data, array $client): mixed { - [$host, $port] = [$clientInfo['address'], $clientInfo['port']]; try { - defer(fn() => fire(Event::SYSTEM_RESOURCE_RELEASES)); + defer(fn() => fire(Event::SYSTEM_RESOURCE_RELEASES)); - $request = $this->_request($clientInfo, $server, $data); + $client['server_port'] = $client['port']; + $name = $this->getName($client, Event::SERVER_RECEIVE); - $router = Snowflake::app()->getRouter(); - if (($node = $router->find_path($request)) === null) { - return $server->sendto($host, $port, Json::encode(['state' => 404])); - } - - $dispatch = $node->dispatch(); - if (!is_string($dispatch)) $dispatch = Json::encode($dispatch); - if (empty($dispatch)) { - $dispatch = Json::encode(['state' => 0, 'message' => 'ok']); - } - return $server->sendto($host, $port, $dispatch); + $result = Event::trigger($name, [$server, $data, $client]); } catch (\Throwable $exception) { - $this->addError($exception, 'packet'); - - $response = Json::encode(['state' => 500, 'message' => $exception->getMessage()]); - - return $server->sendto($host, $port, $response); + $result = logger()->exception($exception); + } finally { + if (is_array($result) || is_object($result)) { + $result = Json::encode($result); + } + $sendData = [$client['address'], $client['port'], $result]; + return $server->sendto(...$sendData); } } diff --git a/HttpServer/Events/OnReceive.php b/HttpServer/Events/OnReceive.php index 55839815..4b009358 100644 --- a/HttpServer/Events/OnReceive.php +++ b/HttpServer/Events/OnReceive.php @@ -7,12 +7,9 @@ namespace HttpServer\Events; use Exception; use HttpServer\Abstracts\Callback; use HttpServer\Http\Request; -use HttpServer\Route\Router; -use ReflectionException; +use Snowflake\Abstracts\Config; use Snowflake\Core\Json; use Snowflake\Event; -use Snowflake\Exception\NotFindClassException; -use Snowflake\Snowflake; use Swoole\Server; /** @@ -22,56 +19,36 @@ use Swoole\Server; class OnReceive extends Callback { - public int $port = 0; + /** + * @param Server $server + * @param int $fd + * @param int $reID + * @param string $data + * @return mixed + * @throws Exception + */ + public function onHandler(Server $server, int $fd, int $reID, string $data): mixed + { + try { + defer(fn() => fire(Event::SYSTEM_RESOURCE_RELEASES)); + $client = $server->getClientInfo($fd, $reID); + $name = $this->getName($client, Event::SERVER_RECEIVE); - public string $host = ''; - - - private Router $router; - - - public function init() - { - $this->router = Snowflake::app()->getRouter(); - } - - - /** - * @param Server $server - * @param int $fd - * @param int $reID - * @param string $data - * @return mixed - * @throws Exception - */ - public function onHandler(Server $server, int $fd, int $reID, string $data): mixed - { - try { - defer(fn() => fire(Event::SYSTEM_RESOURCE_RELEASES)); - - $request = $this->_request($fd, $data, $reID); - if (($node = $this->router->find_path($request)) === null) { - return $server->send($fd, Json::encode(['state' => 404])); - } - $dispatch = $node->dispatch(); - if (!is_string($dispatch)) $dispatch = Json::encode($dispatch); - if (empty($dispatch)) { - $dispatch = Json::encode(['state' => 0, 'message' => 'ok']); - } - if ($server->exist($fd)) { - return $server->send($fd, $dispatch); - } - return $dispatch; - } catch (\Throwable $exception) { - $this->addError($exception, 'receive'); - $error = ['state' => 500, 'message' => $exception->getMessage()]; - if ($server->exist($fd)) { - return $server->send($fd, Json::encode($error)); - } - return Json::encode($error); - } - } + if (Config::get('rpc.port', 0) == $client['server_port']) { + $result = router()->find_path(Request::rpcRequest($fd, $data, $reID))?->dispatch(); + } else { + $result = Event::trigger($name, [$server, $data, $client]); + } + if (is_array($result) || is_object($result)) { + $result = Json::encode($result); + } + } catch (\Throwable $exception) { + $result = logger()->exception($exception); + } finally { + return $server->send($fd, $result); + } + } } diff --git a/HttpServer/Events/OnWorkerStop.php b/HttpServer/Events/OnWorkerStop.php index 6c34d339..921699dc 100644 --- a/HttpServer/Events/OnWorkerStop.php +++ b/HttpServer/Events/OnWorkerStop.php @@ -6,9 +6,7 @@ namespace HttpServer\Events; use Exception; use HttpServer\Abstracts\Callback; -use Snowflake\Error\Logger; use Snowflake\Event; -use Snowflake\Snowflake; use Swoole\Timer; /** diff --git a/HttpServer/Http/Request.php b/HttpServer/Http/Request.php index 401421c9..5b26ef91 100644 --- a/HttpServer/Http/Request.php +++ b/HttpServer/Http/Request.php @@ -415,10 +415,10 @@ class Request extends HttpService { $mainstay = sprintf("%.6f", microtime(true)); // 带毫秒的时间戳 - $timestamp = floor($mainstay); // 时间戳 - $milliseconds = round(($mainstay - $timestamp) * 1000); // 毫秒 + $timestamp = floatval($mainstay); // 时间戳 + $milliseconds = round(($mainstay - $timestamp) * 1000); // 毫秒 - $datetime = date("Y-m-d H:i:s", $timestamp) . '.' . $milliseconds; + $datetime = date("Y-m-d H:i:s", (int)$timestamp) . '.' . $milliseconds; $tmp = [ '[Debug ' . $datetime . '] ', @@ -427,7 +427,6 @@ class Request extends HttpService '`' . $this->headers->getHeader('user-agent') . '`', $this->getRuntime() ]; - return implode(' ', $tmp); } @@ -500,10 +499,11 @@ class Request extends HttpService * @param $fd * @param $data * @param int $reID - * @return Request + * @return mixed|null + * @throws ConfigException * @throws Exception */ - public static function createListenRequest($fd, $data, $reID = 0): Request + public static function rpcRequest($fd, $data, int $reID = 0): Request|null { $sRequest = new Request(); @@ -514,28 +514,11 @@ class Request extends HttpService $sRequest->params = new HttpParams($data, [], []); $port = $sRequest->clientInfo['server_port']; - - $sRequest->headers->setRequestUri('add-port-listen/port_' . $port); - $sRequest->headers->setRequestMethod(self::HTTP_LISTEN); - - $sRequest->checkIsRpcClient()->parseUri(); - - return Context::setContext('request', $sRequest); - } - - - /** - * @throws ConfigException - * @throws Exception - */ - private function checkIsRpcClient(): static - { - $port = $this->clientInfo['server_port']; if (($rpc = Config::get('rpc.port', 0)) !== $port) { - return $this; + return null; } - [$cmd, $repeat, $body] = explode("\n", $this->params->getBody()); + [$cmd, $repeat, $body] = explode("\n", $sRequest->params->getBody()); if (is_null($body) || is_null($cmd) || !empty($repeat)) { throw new Exception('Protocol format error.'); } @@ -543,10 +526,12 @@ class Request extends HttpService if (is_string($body) && is_null($data = Json::decode($body))) { throw new Exception('Protocol format error.'); } - $this->headers->setRequestUri('rpc/p' . $rpc . '/' . ltrim($cmd, '/')); - $this->headers->setRequestMethod(Request::HTTP_CMD); - return $this; + $sRequest->params->setPosts($data); + $sRequest->headers->setRequestUri('rpc/p' . $rpc . '/' . ltrim($cmd, '/')); + $sRequest->headers->setRequestMethod(Request::HTTP_CMD); + + return Context::setContext('request', $sRequest); } @@ -556,7 +541,7 @@ class Request extends HttpService * @return mixed * @throws Exception */ - private static function getClientInfo($fd, $re = 0): mixed + private static function getClientInfo($fd, int $re = 0): mixed { $server = Snowflake::app()->getSwoole(); if (!is_array($fd)) {