php实现登录超时
PHP实现登录超时的方案
使用Session过期时间控制
通过设置session.gc_maxlifetime和session.cookie_lifetime来控制会话过期时间

// 设置session存活时间(秒)
ini_set('session.gc_maxlifetime', 1800); // 30分钟
session_set_cookie_params(1800);
session_start();
// 每次操作时更新最后活动时间
$_SESSION['LAST_ACTIVITY'] = time();
检查最后活动时间
在每次请求时验证用户最后活动时间是否超过限制

$timeout_duration = 1800; // 30分钟超时
if (isset($_SESSION['LAST_ACTIVITY']) &&
(time() - $_SESSION['LAST_ACTIVITY'] > $timeout_duration)) {
session_unset();
session_destroy();
header("Location: login.php?timeout=1");
exit;
}
结合数据库记录
对于需要更精确控制的情况,可以在数据库中存储登录状态
// 用户登录时记录时间戳
$login_time = time();
$sql = "UPDATE users SET last_activity = $login_time WHERE user_id = $user_id";
// 检查时查询数据库
$sql = "SELECT last_activity FROM users WHERE user_id = $user_id";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
if (time() - $row['last_activity'] > 1800) {
// 执行登出操作
}
前端配合实现
通过JavaScript定时检测并提醒用户
let timeoutTimer = setTimeout(logout, 30 * 60 * 1000);
function resetTimeout() {
clearTimeout(timeoutTimer);
timeoutTimer = setTimeout(logout, 30 * 60 * 1000);
}
// 监听用户活动
document.addEventListener('mousemove', resetTimeout);
document.addEventListener('keypress', resetTimeout);
function logout() {
window.location.href = 'logout.php?reason=timeout';
}
完整实现示例
// 登录处理
session_start();
$_SESSION['user_id'] = $user_id;
$_SESSION['LAST_ACTIVITY'] = time();
// 中间件检查
function checkSessionTimeout() {
$timeout = 1800;
if (isset($_SESSION['LAST_ACTIVITY']) &&
(time() - $_SESSION['LAST_ACTIVITY'] > $timeout)) {
session_unset();
session_destroy();
return false;
}
$_SESSION['LAST_ACTIVITY'] = time();
return true;
}
// 使用中间件
if (!checkSessionTimeout()) {
header("Location: login.php?session_expired=1");
exit;
}






