首页 文章

在PHP中销毁会话时出错

提问于
浏览
7

我在PHP(版本5.2.10)的会话处理中遇到问题 . 我使用下面提到的函数进行登录,注销和验证会话 .

login()
{
    session_set_cookie_params(0);
    session_start();
    session_regenerate_id(true);
    $_SESSION['user_id']
}

validate_session()
{
    session_set_cookie_params(0);
    session_start();
    if (isset($_SESSION['user_id']) === FALSE) {
        session_destroy();
        logout();
        header("Location: login_page");
    }
}

logout()
{
    session_set_cookie_params(0);
    session_start();
    $_SESSION = array();
    setcookie(session_name(), '', time() - 3600, '/');
    session_destroy();
}

每个页面首先调用validate_session()函数 . 如果会话无效,则会重定向到登录页面 . login()函数用于为用户创建会话 . 当用户单击logout时,将调用logout()函数来销毁会话 .

问题是:logout()函数随机抛出警告:
Warning: session_destroy(): Session object destruction failed

我很少收到这个警告 . 就像20-30次退出呼叫一样,我得到了一次 . 有什么想法吗?

我正在开发一台Windows XP机器 .

更新:会话存储在文件系统中 .
路径:C:\ WINDOWS \ Temp

3 回答

  • 2

    是否在validate_session()中调用logout()?如果没有,问题可能是在logout()之前调用session_destroy()

    你可以试试这个:

    validate_session()
    {
        session_set_cookie_params(0);
        session_start();
        if ( !isset( $_SESSION['user_id'] ) ) {
            logout();
            header("Location: login_page");
        }
    }
    
    logout()
    {
        $_SESSION = array();
        setcookie(session_name(), '', time() - 3600, '/');
        session_destroy();
    }
    
  • 0

    找到something,这可能对此主题有用 . 基本问题是:

    • 会话是否有效开始 - session_start() 的返回值是多少?

    • 会话文件是否存在于PHP.ini session.save_path 中,可以删除 .

    我怀疑你的情况是第一个 . 我不记得在哪里,但我想我已经看到会话无效的情况,然后由于某种原因尝试重复该过程 .

  • 0

    你是如何存储会话的?如果是基于文件,可能是超时或权限错误?

    另外,我想知道regenerate_id是否导致destroy函数寻找技术上不再存在的会话 . 您是否尝试在重新生成函数中将该布尔参数设置为false?

    我们在CakePHP应用程序上遇到了这个问题,但我们通过使用Cake设置进行了几次修改来纠正它 .

相关问题