如何使 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 中的用户会话过期?的主要内容,如果未能解决你的问题,请参考以下文章