unset($_SESSION[$key]);
}
- // Register custom error handler to catch a possible failure warning during session write
- set_error_handler(function ($errno, $errstr, $errfile, $errline) {
- throw new \ErrorException($errstr, $errno, E_WARNING, $errfile, $errline);
- }, E_WARNING);
+ // Register error handler to add information about the current save handler
+ $previousHandler = set_error_handler(function ($type, $msg, $file, $line) use (&$previousHandler) {
+ if (E_WARNING === $type && 0 === strpos($msg, 'session_write_close():')) {
+ $handler = $this->saveHandler instanceof SessionHandlerProxy ? $this->saveHandler->getHandler() : $this->saveHandler;
+ $msg = sprintf('session_write_close(): Failed to write session data with "%s" handler', \get_class($handler));
+ }
+
+ return $previousHandler ? $previousHandler($type, $msg, $file, $line) : false;
+ });
try {
- $e = null;
session_write_close();
- } catch (\ErrorException $e) {
} finally {
restore_error_handler();
$_SESSION = $session;
}
- if (null !== $e) {
- // The default PHP error message is not very helpful, as it does not give any information on the current save handler.
- // Therefore, we catch this error and trigger a warning with a better error message
- $handler = $this->getSaveHandler();
- if ($handler instanceof SessionHandlerProxy) {
- $handler = $handler->getHandler();
- }
-
- trigger_error(sprintf('session_write_close(): Failed to write session data with %s handler', get_class($handler)), E_USER_WARNING);
- }
$this->closed = true;
$this->started = false;
}
if ($this->saveHandler instanceof SessionHandlerProxy) {
- session_set_save_handler($this->saveHandler->getHandler(), false);
- } elseif ($this->saveHandler instanceof \SessionHandlerInterface) {
session_set_save_handler($this->saveHandler, false);
}
}