我在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
答案 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。基本问题是:
session_start()
的返回值是什么?session.save_path
中,并且可以删除。我怀疑你的情况是第一个。我不记得在哪里,但我想我已经看到会话无效的情况,然后由于某种原因试图重复该过程。