在 php.net 的 session_regenerate_id 手册页上,他们建议不要使用该函数,因为如果有人没有可靠的互联网连接,您可能会遇到问题。我使用他们提出的代码作为替代方案,但遇到了问题。
function regenerateId(): bool {
// code protecting against logouts due to unstable internet connections
// copied from https://www.php.net/manual/en/function.session-regenerate-id.php
// New session ID is required to set proper session ID
// when session ID is not set due to unstable network.
$new_session_id = session_create_id();
$_SESSION['new_session_id'] = $new_session_id;
// Set destroy timestamp
$_SESSION['destroyed'] = time();
// Write and close current session;
session_commit() ;
// Start session with new session ID
ini_set('session.use_strict_mode', 0);
session_id($new_session_id);
$result = session_start();
//ini_set('session.use_strict_mode', 1); // gives error, elsewhere on php.net they removed this from the example
die('<pre>'.$result.'/'.$new_session_id.'<br>'.print_r($_SESSION,true));
// New session does not need them
unset($_SESSION['destroyed']);
unset($_SESSION['new_session_id']);
// die('regenerated: '. $_SESSION['UID']);
return $result ;
}
我添加了
die()
语句只是为了确认为什么我在重新生成 id 时总是注销:$_SESSION 数组是空的。
奇怪,因为代码直接来自 php.net(删除了一个错误,请参阅评论)。我被卡住了,又回到原来的
session_regenerate_id()
。我使用的是 PHP 8.1.26
顺便说一句,
session_commit()
和session_start()
都返回true。
有谁明白为什么 php.net 代码不起作用并使
$_SESSION
完全为空?和/或如何解决它?
PS。我排除了处理
$_SESSION['destroyed']
的代码,因为它与这个问题无关。它位于 https://www.php.net/manual/en/function.session-regenerate-id.php
终于在StackOverflow上找到了:php.net上的代码不完整。在正确重新生成会话ID上找到它:
keepSession = $_SESSION ;
// Write and close current session;
session_commit();
// Start session with new session ID
ini_set('session.use_strict_mode', 0);
session_id($new_session_id);
$result = session_start();
$_SESSION = $keepSession
将这个问题保留在这里是因为我一开始找不到其他问题,我认为我的措辞可能会帮助其他人寻找相同的问题。