27 private $prefetchData;
28 private $newSessionId;
29 private $igbinaryEmptyData;
34 public function open($savePath, $sessionName)
36 $this->sessionName = $sessionName;
37 if (!headers_sent() && !ini_get(
'session.cache_limiter') &&
'0' !== ini_get(
'session.cache_limiter')) {
38 header(sprintf(
'Cache-Control: max-age=%d, private, must-revalidate', 60 * (
int) ini_get(
'session.cache_expire')));
49 abstract protected function doRead($sessionId);
57 abstract protected function doWrite($sessionId, $data);
64 abstract protected function doDestroy($sessionId);
71 $this->prefetchData = $this->
read($sessionId);
72 $this->prefetchId = $sessionId;
74 if (\PHP_VERSION_ID < 70317 || (70400 <= \PHP_VERSION_ID && \PHP_VERSION_ID < 70405)) {
76 foreach (debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) as $frame) {
77 if (!isset($frame[
'class']) && isset($frame[
'function']) && \in_array($frame[
'function'], [
'session_regenerate_id',
'session_create_id'],
true)) {
78 return '' === $this->prefetchData;
83 return '' !== $this->prefetchData;
89 public function read($sessionId)
91 if (
null !== $this->prefetchId) {
92 $prefetchId = $this->prefetchId;
93 $prefetchData = $this->prefetchData;
94 $this->prefetchId = $this->prefetchData =
null;
96 if ($prefetchId === $sessionId ||
'' === $prefetchData) {
97 $this->newSessionId =
'' === $prefetchData ? $sessionId :
null;
103 $data = $this->
doRead($sessionId);
104 $this->newSessionId =
'' === $data ? $sessionId :
null;
112 public function write($sessionId, $data)
114 if (
null === $this->igbinaryEmptyData) {
116 $this->igbinaryEmptyData = \function_exists(
'igbinary_serialize') ? igbinary_serialize([]) :
'';
118 if (
'' === $data || $this->igbinaryEmptyData === $data) {
119 return $this->
destroy($sessionId);
121 $this->newSessionId =
null;
123 return $this->
doWrite($sessionId, $data);
131 if (!headers_sent() && filter_var(ini_get(
'session.use_cookies'), FILTER_VALIDATE_BOOLEAN)) {
132 if (!$this->sessionName) {
133 throw new \LogicException(sprintf(
'Session name cannot be empty, did you forget to call "parent::open()" in "%s"?.', static::class));
144 if (
null === $cookie || isset($_COOKIE[$this->sessionName])) {
145 if (\PHP_VERSION_ID < 70300) {
146 setcookie($this->sessionName,
'', 0, ini_get(
'session.cookie_path'), ini_get(
'session.cookie_domain'), filter_var(ini_get(
'session.cookie_secure'), FILTER_VALIDATE_BOOLEAN), filter_var(ini_get(
'session.cookie_httponly'), FILTER_VALIDATE_BOOLEAN));
148 $params = session_get_cookie_params();
149 unset($params[
'lifetime']);
150 setcookie($this->sessionName,
'', $params);
155 return $this->newSessionId === $sessionId || $this->
doDestroy($sessionId);