【问题标题】:session_regenerate_id is not creating a new session idsession_regenerate_id 没有创建新的会话 ID
【发布时间】:2015-10-04 21:07:28
【问题描述】:

我有一个脚本,用于完成当前会话并开始一个新会话。我使用了一段代码,它在我的开发计算机上运行良好。但是,当我将其发布到生产服务器时,会话 ID 始终保持不变。

以下是我重启会话的代码:

session_start();

$_SESSION = array();
$_POST = array();
$_GET = array();

if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), 
              '', 
              time() - 42000,
              $params["path"], 
              $params["domain"],
              $params["secure"], 
              $params["httponly"]
    );
}
session_destroy();
session_write_close();
session_start();    

session_regenerate_id(true);

在最后一行,没有生成新的会话 id。

为什么这在运行 PHP 的两台服务器之间会有所不同?我能做些什么来纠正它?

【问题讨论】:

  • 你在那里做什么?

标签: php session session-state


【解决方案1】:

经过一些实验,我解决了这个问题。

如果任何文本已写入响应,则 session_regenerate_id(true) 行不会重新生成新的会话 ID。我已经有一系列 echo 语句发出用于调试目的的文本,并且在我删除它们之后创建了新的会话 ID。

【讨论】:

    【解决方案2】:

    session_regenerate_id() 使用新生成的会话 ID 更新当前会话 ID。它不会更改会话变量。

    echo session_id();
    session_regenerate_id();
    echo session_id(); 
    

    你应该取消设置会话来做到这一点:

    unset($_SESSION); // or
    $_SESSION = array();
    

    如何开始一个新会话:

    session_start();
    session_destroy();
    session_regenerate_id();
    unset($_SESSION);
    session_start();
    

    【讨论】:

    • 我也试过了,不幸的是会话ID仍然保持不变。
    • 实际上,如果 cookie 也被销毁,这段代码也可以工作。
    猜你喜欢
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多