如何使 PHP 中的用户会话过期?

Posted

技术标签:

【中文标题】如何使 PHP 中的用户会话过期?【英文标题】:How can I expire a user's session in PHP? 【发布时间】:2011-12-06 10:31:18 【问题描述】:

有人说使用unset($_SESSION["..."]),有人说session_unset(),有人说$_SESSION = array(),有人说session_destroy(),我说“看在上帝的份上,这东西越来越混乱,谁能解释一下注销用户的正确/安全方式”以及用于什么用途?

赞赏...

【问题讨论】:

【参考方案1】:
<?php
// Initialize the session.
// If you are using session_name("something"), don't forget it now!
session_start();

// Unset all of the session variables.
$_SESSION = array();

// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) 
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
    $params["path"], $params["domain"],
    $params["secure"], $params["httponly"]
    );


// Finally, destroy the session.
session_destroy();
?>

RTM

【讨论】:

但是我们为什么要取消设置所有的 $_SESSION 而不是只使用session_destroy()session_destroy() 不删除所有变量和数据? 当我们调用session_start() 时,$_SESSION 数组会从服务器上的会话文件加载到 RAM - 这是在请求之间保存会话变量的地方。 session_destroy() 将删除会话文件。它清除$_SESSION数组。【参考方案2】:

唯一说 session_unset() 的是那些停留在过时版本的 PHP 上的人——这个函数已经被弃用了很长时间。

这个问题的确切答案取决于您的代码使用什么来确定某人是否“登录”v.s. “退出”的人。

如果您有一个 $_SESSION['logged_in'] = true 供您的代码查找,那么为什么要取消设置呢?只需将其设置为 false 并繁荣...用户已注销。

【讨论】:

我没有看到 session_unset() 在 the manual 中被弃用 - 你能引用这个吗? session_unset 与已弃用的 session_register 相反。现在所有会话变量操作都应该直接在 $_SESSION 上完成,将其视为常规数组。 感谢您提供的信息。 TBH,我从来没有使用过session_unset(),并且总是使用$_SESSION = array() 清除会话变量,因为手册说我们应该:-) - 我看到session_unregister() is 在手册,但session_unset() 没有此类通知。【参考方案3】:

session_destroy — 销毁所有注册到会话的数据 session_unset — 释放所有会话变量

http://www.php.net/manual/en/book.session.php

我见过最多的就是按这个顺序调用它们。

session_unset();
session_destroy();
$_SESSION = array();

【讨论】:

【参考方案4】:

这是实体之间的区别

您可以删除会话中的单个变量

 unset($_SESSION['shape']);

这将删除会话中的所有变量,但不会删除会话本身

 session_unset();

这会破坏会话变量

 session_destroy();

【讨论】:

【参考方案5】:

首先,session_destroy() 与其他方法不一样。这将破坏服务器上的当前会话数据,但不会取消设置任何变量。它只是 session_start() 的对应物。

session_unset()deprecated 等价于 $_SESSION = array()。后者和unset($_SESSION["..."]) 的不同之处仅在于unset() 路由只会取消设置一个会话变量,即[...] 中命名的那个。永远不要这样做unset($_SESSION),因为这会干扰会话机制本身。

Old question reference.

【讨论】:

【参考方案6】:

如果您使用session_destroy(),则浏览器中的 cookie 也会被清除(并且可能稍后会创建一个新会话)

我个人使用一个对象来跟踪不同的事物(例如 public loggedIn = False; 和一个真正让用户登录的函数)

如果你想保留 cookie,session_unset() 很方便,但你最终会在服务器中得到更多的空会话

【讨论】:

session_destroy() 对 cookie 没有任何作用——它会删除服务器上存储的会话数据(即用于存储会话变量的临时文件)。它用于保持服务器端的清洁,而不会过于依赖垃圾收集器。要删除 cookie,您需要将其值设置为空字符串,并将其过期时间设置为过去的某个时间。

以上是关于如何使 PHP 中的用户会话过期?的主要内容,如果未能解决你的问题,请参考以下文章

如何由于 Django 中的不活动而使会话过期?

如何在 10 分钟不活动后使 PHP 会话过期? [复制]

如何让 PHP 会话在浏览器关闭或一段时间后过期

其中 jsonwebtoken 存储在服务器 nodejs 中。用户注销后如何使 JWT 过期

如何防止会话在顶点过期?

PHP 会话过期 - 它啥时候刷新?