我花了一段时间来解决这个问题的确切原因,但这里似乎正在发生的事情:
我有一个 Session . 我想彻底杀死我当前的会话,并从头开始,一个全新的会话,有一个空白的板岩 .
所以这就是我做的:
public function unregister_session()
{
// I COMMENTED THOSE SECTIONS THAT I WASNT SURE WHAT THEY WERE DOING, BUT PROBLEM PERSISTS.
//session_regenerate_id();
//$params = session_get_cookie_params();
// setcookie(session_name(), '', time() - 42000,
// $params["path"], $params["domain"],
// $params["secure"], $params["httponly"]);
unset($_SESSION);
$_SESSION=array();
echo '<br> destroying session. old SID:'.session_id(); //echos 'qqhu7on0n...'
session_unset();
session_destroy();
echo '<br> limbo SID:'.session_id(); //echos nothing.
session_start();
echo '<br> new SID:'.session_id(); //echos 'qqhu7on0n...'
}
好吧,我认为应该发生的是我有一个新的 Session . 好吧它有点工作,因为关于前一届 Session 的一切似乎都被遗忘了,至少如果我看一下 $_SESSION
.
但每当我回显session_id时,它仍然会给我旧的会话ID!当我将任何值写入$ _SESSION时,它们不会转移到下一页,而是在下一页 $_SESSION
为空!
编辑:我在我的脚本上的多个地方回显session_id()(从上到下)我总是显示相同的session_id . 进入谷歌开发者工具查看我的cookie,我看到PHPSESSID的不同ID . 当我试图在下一页上回显session_id()时,我会看到确切的ID ...
Why is this happening and what am I doing wrong? How can I get session_id() to show me the NEW session id, not the old one? How can I write values into the NEW $_SESSION variable, so that they are actually carried over to the next page?
EDIT - THE SOLUTION
public function unregister_session()
{
// DUNNO IF THE COMMENTED SECTIONS MAKE A DIFFERENCE
//$params = session_get_cookie_params();
// setcookie(session_name(), '', time() - 42000,
// $params["path"], $params["domain"],
// $params["secure"], $params["httponly"]);
unset($_SESSION);
$_SESSION=array();
echo '<br> destroying session. old SID:'.session_id(); //echos 'qqhu7on0n...'
session_unset();
session_destroy();
echo '<br> limbo SID:'.session_id(); //echos nothing.
session_start();
session_regenerate_id(TRUE); //THIS DOES THE TRICK! Calling it after session_start. Dunno if true makes a difference.
echo '<br> new SID:'.session_id(); //echos '7b2jn...' :-)
}
2 回答
结帐,http://php.net/manual/en/function.session-regenerate-id.php
确保在调用该函数的任何页面上调用session_start . 我也会取消注释用于销毁cookie的代码 . 这可以防止缓存数据的奇怪问题 .