session_unset() 是清除和重置 PHP 会话变量的正确方法吗?

Posted

技术标签:

【中文标题】session_unset() 是清除和重置 PHP 会话变量的正确方法吗?【英文标题】:is session_unset() the correct way to clear and reset PHP Sessions variables? 【发布时间】:2019-12-24 15:05:47 【问题描述】:

我正在开发 php 中的会话管理功能。我找到了一个展示如何实现会话超时的网页 (https://solutionfactor.net/blog/2014/02/08/implementing-session-timeout-with-php/)...我注意到他们使用 session_unset() 和 session_destroy() 方法。

我对 session_unset() 的使用感到困惑

在查看 PHP 手册 (https://www.php.net/manual/en/function.session-unset.php) 时,有注释说:

session_unset() 函数释放当前注册的所有会话变量。

注意:如果使用$_SESSION,请使用unset()注销会话变量,即unset ($_SESSION['varname']);。

注意不要使用 unset($_SESSION) 取消设置整个 $_SESSION,因为这将禁用通过 $_SESSION 超全局变量注册会话变量。

注意:只对不使用 $_SESSION 的旧代码使用 session_unset()。

这是我所拥有的,基于之前引用的页面上的示例。 ($sysTime 将是调用时传递给函数的服务器时间。

//Define SYS_SES_TIMEOUT - How many seconds is a session valid for. 1800 seconds = 30 minutes
    define("SYS_SES_TIMEOUT", 1800);
    session_start();

    function fSessionMgmnt_isExpired($sysTime)
        if(isset($_SESSION['Expire_DT']) && ($sysTime - $_SESSION['Expire_DT']) > SYS_SES_TIMEOUT)
            session_unset(); session_destroy; session_start(); 
            //redirect to login page
        else//proceed to next check
    

我的目标是,如果会话过期,则清除会话并将用户带回登录页面以重新进行身份验证......将在其中创建新会话。

根据 php 手册,我不确定 session_unset() 是否是正确的使用方法。特别是因为 session_destroy() 表示它不会取消设置与会话关联的变量,并且 session_unset() 页面注释了不推荐使用的代码。

感谢指导。

[请注意,虽然这已被标记为 PHP - Does session_unset unregister $_SESSION vars? 的潜在副本,但我不同意,建议的帖子询问该函数的作用,而我的问题是询问处理场景的正确方法。 ]

【问题讨论】:

PHP - Does session_unset unregister $_SESSION vars?的可能重复 请注意手册中有一条注释:“仅对不使用 $_SESSION 的旧代码使用 session_unset()”。 【参考方案1】:

session_destroy() function: 它会破坏与当前会话关联的所有数据。它不会取消设置与会话关联的任何全局变量,也不会取消设置会话 cookie。

注意:如果要终止会话,请同时删除会话 cookie。这将破坏会话,而不仅仅是会话数据。

session_unset() function: 它只删除会话中的变量,会话仍然存在。只有数据被截断。

您可以访问此link 了解更多信息并找出您真正需要的东西。 也可以看例子描述here

【讨论】:

所以如果我使用 session_destroy() 然后使用 session_start() 开始一个新会话,$_SESSION 会保留上一个会话的内容和值吗? @psycoperl 不,session_destroy() 之后你不会有旧的会话数据 澄清我之前的评论:你可以忘记session_unset() 的存在。我不知道为什么它没有与session_register() 一起被删除。它只是 PHP/4 中早期会话实现的残余。【参考方案2】:

session_unset() 函数用于销毁单个会话变量。但是session_destroy() 函数会破坏整个 php 会话。所以在你的情况下,最好使用session_destroy()

【讨论】:

以上是关于session_unset() 是清除和重置 PHP 会话变量的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中 unset($_SESSION[])、session_unset() 和 session_destroy() 的区别

寻找重置或清除 DataReader 的方法

使用按钮清除/重置 div 的内容

JavaScript 表格输入预填充清除和重置

如何清除和重置 Core Data 数据模型

如何清除/重置 jQuery UI Datepicker 日历上的选定日期?