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() 的区别