From d34aa0917b80de98b416ad109c85ef15c5e6e314 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Thu, 24 Oct 2019 10:35:16 +0200 Subject: [PATCH] WS tick interval, WS manager able to limit connections per session --- pandora_console/include/lib/WSManager.php | 13 +++++++++-- .../include/lib/WebSocketServer.php | 22 ++++++++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/lib/WSManager.php b/pandora_console/include/lib/WSManager.php index 41f1c6732c..143fd2366a 100644 --- a/pandora_console/include/lib/WSManager.php +++ b/pandora_console/include/lib/WSManager.php @@ -130,6 +130,13 @@ class WSManager extends WebSocketServer */ public $handlerTick = []; + /** + * Allow only one connection per user session. + * + * @var boolean + */ + public $socketPerSession = false; + /** * Builder. @@ -292,8 +299,10 @@ class WSManager extends WebSocketServer ); $this->stderr('ONLINE '.$user->address.'('.$user->account->idUser.')'); - // Disconnect previous sessions. - $this->cleanupSocketByCookie($user); + if ($this->socketPerSession === true) { + // Disconnect previous sessions. + $this->cleanupSocketByCookie($user); + } // Launch registered handler. $this->callHandler( diff --git a/pandora_console/include/lib/WebSocketServer.php b/pandora_console/include/lib/WebSocketServer.php index 68c129693d..2d9eb1d9fd 100644 --- a/pandora_console/include/lib/WebSocketServer.php +++ b/pandora_console/include/lib/WebSocketServer.php @@ -164,6 +164,21 @@ abstract class WebSocketServer */ public $timeout = 1; + /** + * Do not call tick every iteration, use a minimum time lapse. + * Measure: seconds. + * + * @var integer + */ + public $tickInterval = 1; + + /** + * Last tick call. (unix timestamp). + * + * @var integer + */ + public $lastTickTimestamp = 0; + /** * Builder. @@ -420,7 +435,12 @@ abstract class WebSocketServer $except = null; $write = null; $this->pTick(); - $this->tick(); + + if ((time() - $this->lastTickTimestamp) > $this->tickInterval) { + $this->lastTickTimestamp = time(); + $this->tick(); + } + socket_select($read, $write, $except, 0, $this->timeout); foreach ($read as $socket) { if ($socket == $this->master) {