diff --git a/Server/ServerManager.php b/Server/ServerManager.php index 3900bf53..5f5c3bfd 100644 --- a/Server/ServerManager.php +++ b/Server/ServerManager.php @@ -338,8 +338,10 @@ class ServerManager extends Abstracts\Server $this->server->on('handshake', [$reflect, 'onHandshake']); $this->server->on('message', [$reflect, 'onMessage']); $this->server->on('close', [$reflect, 'onClose']); + $this->server->on('disconnect', [$reflect, 'onDisconnect']); $reflect->setEvents(Constant::HANDSHAKE, $settings['events'][Constant::HANDSHAKE] ?? null); + $reflect->setEvents(Constant::DISCONNECT, $settings['events'][Constant::DISCONNECT] ?? null); $reflect->setEvents(Constant::MESSAGE, $settings['events'][Constant::MESSAGE] ?? null); $reflect->setEvents(Constant::CONNECT, $settings['events'][Constant::CONNECT] ?? null); $reflect->setEvents(Constant::CLOSE, $settings['events'][Constant::CLOSE] ?? null); @@ -388,13 +390,12 @@ class ServerManager extends Abstracts\Server */ private function addCloseOrDisconnect($reflect, $settings): void { - if (swoole_version() >= '4.7.0') { - $this->server->on('disconnect', [$reflect, 'onDisconnect']); + if (swoole_version() >= '4.7') { $reflect->setEvents(Constant::DISCONNECT, $settings['events'][Constant::DISCONNECT] ?? null); - } else { - $this->server->on('close', [$reflect, 'onClose']); - $reflect->setEvents(Constant::CLOSE, $settings['events'][Constant::CLOSE] ?? null); + $this->server->on('disconnect', [$reflect, 'onDisconnect']); } + $reflect->setEvents(Constant::CLOSE, $settings['events'][Constant::CLOSE] ?? null); + $this->server->on('close', [$reflect, 'onClose']); } diff --git a/Server/WebSocketServerListener.php b/Server/WebSocketServerListener.php index 63654faa..685dc53b 100644 --- a/Server/WebSocketServerListener.php +++ b/Server/WebSocketServerListener.php @@ -46,6 +46,7 @@ class WebSocketServerListener extends Abstracts\Server $reflect = Snowflake::getDi()->getReflect(static::class)?->newInstance(); $reflect->setEvents(Constant::CONNECT, $settings['events'][Constant::CONNECT] ?? null); $reflect->setEvents(Constant::HANDSHAKE, $settings['events'][Constant::HANDSHAKE] ?? null); + $reflect->setEvents(Constant::DISCONNECT, $settings['events'][Constant::DISCONNECT] ?? null); $reflect->setEvents(Constant::MESSAGE, $settings['events'][Constant::MESSAGE] ?? null); $reflect->setEvents(Constant::CLOSE, $settings['events'][Constant::CLOSE] ?? null); @@ -58,6 +59,7 @@ class WebSocketServerListener extends Abstracts\Server static::$_http->on('connect', [$reflect, 'onConnect']); static::$_http->on('handshake', [$reflect, 'onHandshake']); static::$_http->on('message', [$reflect, 'onMessage']); + static::$_http->on('disconnect', [$reflect, 'onDisconnect']); static::$_http->on('close', [$reflect, 'onClose']); return static::$_http; @@ -145,4 +147,17 @@ class WebSocketServerListener extends Abstracts\Server $this->_event->dispatch(Event::SYSTEM_RESOURCE_RELEASES); } + + /** + * @param Server $server + * @param int $fd + * @throws Exception + */ + public function onDisconnect(Server $server, int $fd) + { + $this->runEvent(Constant::DISCONNECT, fn() => $server->confirm($fd), [$server, $fd]); + + $this->_event->dispatch(Event::SYSTEM_RESOURCE_RELEASES); + } + }