bug #28562 [HttpFoundation] fix hidding warnings from session handlers (nicolas-grekas)
This PR was merged into the 3.4 branch.
Discussion
----------
[HttpFoundation] fix hidding warnings from session handlers
| Q | A
| ------------- | ---
| Branch? | 3.4
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #28467
| License | MIT
| Doc PR | -
The current logic is too greedy.
Commits
-------
f405b4d5a0
[HttpFoundation] fix hidding warnings from session handlers
This commit is contained in:
commit
2fe425b339
@ -230,29 +230,22 @@ class NativeSessionStorage implements SessionStorageInterface
|
|||||||
unset($_SESSION[$key]);
|
unset($_SESSION[$key]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register custom error handler to catch a possible failure warning during session write
|
// Register error handler to add information about the current save handler
|
||||||
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
|
$previousHandler = set_error_handler(function ($type, $msg, $file, $line) use (&$previousHandler) {
|
||||||
throw new \ErrorException($errstr, $errno, E_WARNING, $errfile, $errline);
|
if (E_WARNING === $type && 0 === strpos($msg, 'session_write_close():')) {
|
||||||
}, E_WARNING);
|
$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 {
|
try {
|
||||||
$e = null;
|
|
||||||
session_write_close();
|
session_write_close();
|
||||||
} catch (\ErrorException $e) {
|
|
||||||
} finally {
|
} finally {
|
||||||
restore_error_handler();
|
restore_error_handler();
|
||||||
$_SESSION = $session;
|
$_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->closed = true;
|
||||||
$this->started = false;
|
$this->started = false;
|
||||||
|
Reference in New Issue
Block a user