【问题标题】:I get warning of Cannot regenerate session id - session is not active for no reason sometimes我收到无法重新生成会话 ID 的警告 - 会话有时无缘无故不活动
【发布时间】:2021-11-08 13:15:48
【问题描述】:

我看过很多关于这个问题的帖子,但没有一个能解决我的问题!有人说这是因为用户在 session_start(); 之前使用了 session_regenerate_id(true); !但是,我的代码并非如此。我还看到有人说我应该在 session_start(); 之前删除多余的空格,我这样做了,但我仍然在加载网站时收到警告。刷新 Boom 后,会话被破坏并且用户注销。

注意*:我收到第 12 行的警告(第三个 if 语句)。

我的每一页开头的代码:

<?php 
session_start();
require "DB/users-database.php";
if(isset($_SESSION['starttime']) && (time() - $_SESSION['starttime'] > 1200)){
    session_destroy();
} else {
    $_SESSION['starttime'] = time();
    session_regenerate_id(true);
}

if(isset($_SESSION['starttime'])){
    if(time() - $_SESSION['starttime'] > 180) {
        session_regenerate_id(true);
    }
}
.
.
.

【问题讨论】:

  • 嗯听起来很有趣。
  • 你遇到了什么错误?
  • 无法重新生成会话 ID - 会话未激活

标签: php html session


【解决方案1】:

您尝试从被破坏的会话中重新生成 ID。让我们看看会发生什么,如果我们说 $_SESSION 中的 'starttime' 索引已定义并且 time() - $_SESSION['starttime'] &gt; 1200 为真:


<?php 
//There, you start your session. It's ok.
session_start();

require "DB/users-database.php";
if(isset($_SESSION['starttime']) && (time() - $_SESSION['starttime'] > 1200)){
    //There, you destroy it because `starttime` is set, and time() - starttime > 1200
    session_destroy();
} else {
    $_SESSION['starttime'] = time();
    session_regenerate_id(true);
}

//It's true, since $_SESSION['starttime'] was set before, no reason to not been set there
if(isset($_SESSION['starttime'])){
    //Indeed, if time() - starttime > 1200, it's also > to 180 
    if(time() - $_SESSION['starttime'] > 180) {
        //you try to regenerate ID on a session that you already destroyed.
        session_regenerate_id(true);
    }
}

我认为您希望使用 session_destroy 清理 $_SESSION。它不是。见https://www.php.net/manual/en/function.session-destroy.php

session_destroy() 销毁与当前会话关联的所有数据。 它不会取消设置与会话关联的任何全局变量,或取消设置会话 cookie。要再次使用会话变量,必须调用 session_start()。

因此,根据文档,一种解决方案是在session_destroy() 之后立即调用session_start(),以使您的代码正常工作:

if(isset($_SESSION['starttime']) && (time() - $_SESSION['starttime'] > 1200)){
    //There, you destroy it because `starttime` is set, and time() - starttime > 1200
    session_destroy();
    session_start(); //According to the documentation, from this point $_SESSION have been reseted.
} else {
    $_SESSION['starttime'] = time();
    session_regenerate_id(true);
}

【讨论】:

  • 您的回答很完整,您的知识也值得尊敬。谢谢您的回答。很高兴知道 session_destroy 不会取消设置会话全局变量!你今天认为我有用,我尊重这一点。再次感谢
  • 我记得当我开始学习 PHP 时,我在课程中长期挣扎。对我来说,这只是经验。很高兴今天对您有所帮助。
  • 抱歉,再问一个问题。您是否建议我应该使用 unset() 函数而不是 session_destroy() ?或者我应该同时使用?
  • 你不需要。如果您调用session_destroy() THEN session_start(),PHP 将为您取消设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多