在PHP中销毁会话时出错

时间:2011-07-01 13:47:54

标签: php session

我在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()函数随机抛出警告:
警告:session_destroy():会话对象销毁失败

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

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

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

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

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

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

我们在CakePHP应用程序上遇到了这个问题,但是我们通过使用Cake设置进行游戏来纠正它。

答案 2 :(得分:0)

找到可能对此主题有用的something。基本问题是:

  1. 会话是否有效开始 - session_start()的返回值是什么?
  2. 会话文件是否存在于PHP.ini session.save_path中,并且可以删除。
  3. 我怀疑你的情况是第一个。我不记得在哪里,但我想我已经看到会话无效的情况,然后由于某种原因试图重复该过程。