这是我第一次发帖。我相信我已经在其他一些论坛中进行了搜索,以查看是否已经提出了我的问题,但是我仍然挠头。我知道有很多关于过期会话的帖子,但是我想是在特定情况下考虑的。
用户登录到仪表板并转到页面。它闲置了多长时间,然后垃圾收集器执行其操作并清除会话。
现在,如果用户返回到仪表板并单击以转到另一个页面,我希望用户返回索引页面-有效注销。
我有一个注销页面,用户选择注销时可以转到该页面。我在数据库中记录了一些数据,删除了会话并重定向回主页。
我想先检查一下会话是否确实还活着。如果不是,请销毁它并重定向到主页。否则,将其删除。
但是我的问题是,如果垃圾收集器已经清除了会话,我是否甚至需要销毁它?
<?php
session_start( );
if( !isset( $_SESSION['session'] ) ) {
session_destroy( );
header( "Location: /index.php" );
}
else {
// ... log the data I need in the database ...
$_SESSION['session'] = array( );
if( ini_get( "session.use_cookies" ) ) {
$params = session_get_cookie_params( );
setcookie( session_name( ), '', time( ) - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"] );
}
session_destroy( );
header( "Location: /index.php" );
}
?>
答案 0 :(得分:1)
对您问题的简短回答:不,您不必自己破坏会话。
session_start()
将始终开始或继续一个会话,并且该会话将始终是“活动的”。但是,此会话是否将具有已登录用户的标志取决于您。
要确定用户的登录状态,您可以将一些“标志”保存到会话中,例如:userId
。然后,在session_start()
之后(登录页面上除外),您可以检查此会话变量。如果存在,则用户登录。如果不存在,则意味着新用户或会话cookie已过期(注销)的用户。在这两种情况下,您都只能重定向到登录页面。就是这样。
另外,从常规代码isn't recommended调用session_destroy()
。
答案 1 :(得分:0)
session_start()
和session_destroy()
不能以您认为的方式与垃圾收集器一起使用。他们利用内部适配器允许PHP与持久层(通常是文件系统,在这种情况下为浏览器cookie)进行通信,以提取会话信息。
当您调用session_destroy()
时,您正在做的是指示会话ADAPTER销毁该会话,而不是PHP。 PHP垃圾会不断收集会话内存使用情况,但仍会保留对适配器对会话数据持久性的引用。
因此,是的,除非已销毁它,否则必须调用它。