diff --git a/src/Session.php b/src/Session.php index d6e4e40..faf6135 100644 --- a/src/Session.php +++ b/src/Session.php @@ -3,9 +3,11 @@ use ArrayAccess; use ArrayObject; +use Exception; use Gt\TypeSafeGetter\NullableTypeSafeGetter; use Gt\TypeSafeGetter\TypeSafeGetter; use SessionHandlerInterface; +use Throwable; use Traversable; class Session implements SessionContainer, TypeSafeGetter { @@ -128,19 +130,31 @@ protected function getAbsolutePath(string $path):string { return $path; } - /** @SuppressWarnings(PHPMD.Superglobals) */ + /** @SuppressWarnings("PHPMD.Superglobals") */ protected function createNewId():string { if(($this->config["use_trans_sid"] ?? null) - && !$this->config["use_cookies"]) { + && !$this->config["use_cookies"]) { return $_GET[$this->config["name"]] ?? session_create_id(); } return session_create_id() ?: ""; } + /** @SuppressWarnings("PHPMD.EmptyCatchBlock") */ protected function readSessionData():?SessionStore { - return unserialize($this->sessionHandler->read($this->id)) ?: null; + try { + $data = $this->sessionHandler->read($this->id) ?: ""; + $store = unserialize($data); + if ($store instanceof SessionStore) { + return $store; + } + } + // PHPCS:ignore + catch (Throwable) {} + + return null; } + public function write():bool { return $this->sessionHandler->write( $this->id, @@ -208,14 +222,29 @@ private function getSessionOptions( ]; } - /** @param array $sessionOptions */ + /** + * @param array $sessionOptions + * @SuppressWarnings("PHPMD.EmptyCatchBlock") + */ private function tryStartSession(array $sessionOptions):void { $startAttempts = 0; do { - $success = session_start($sessionOptions); + $success = false; + + try { + if(session_status() === PHP_SESSION_ACTIVE) { + $success = true; + } + else { + $success = session_start($sessionOptions); + } + } + // PHPCS:ignore + catch(Throwable) {} + if(!$success) { - //phpcs:ignore - @session_destroy(); + session_destroy(); + session_regenerate_id(true); } $startAttempts++; } diff --git a/src/SessionSetup.php b/src/SessionSetup.php index c548a9f..a5544bb 100644 --- a/src/SessionSetup.php +++ b/src/SessionSetup.php @@ -19,6 +19,9 @@ public static function attachHandler( // There is no need to set the save handler on the inbuilt SessionHandler as // it's already set. + if(session_status() === PHP_SESSION_ACTIVE) { + return $sessionHandler; + } if($handlerClass !== SessionHandler::class) { session_set_save_handler($sessionHandler, true); }