首页 > 解决方案 > 删除过期会话

问题描述

这是我第一次发帖。我相信我已经搜索了一些其他论坛,看看我的问题是否已经被问过,但我仍然摸不着头脑。我知道有很多关于过期会话的帖子,但我想我正在考虑一个特定的场景。

用户登录到仪表板并转到一个页面。它闲置了多长时间,然后垃圾收集器完成它的工作并清除会话。

现在,如果用户返回仪表板并单击以转到另一个页面,我希望用户返回索引页面 - 有效地注销。

我有一个注销页面,用户在选择注销时可以转到该页面。我在数据库中记录了一些数据,删除会话并重定向回主页。

我想首先检查会话是否确实存在。如果不是,则将其销毁并重定向到主页。否则,删除它。

但我的问题是,如果垃圾收集器已经清除了会话,我还需要销毁它吗?

<?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" );    
  }

?>

标签: phpsession-cookies

解决方案


对您的问题的简短回答:不,您不必自己破坏会话。

session_start()将始终启动或恢复会话,并且此会话将始终“活动”。不过,此会话是否具有已登录用户的标志取决于您。

要确定用户的登录状态,您只需将一些“标志”保存到会话中,例如:userId. 然后,之后session_start()(登录页面除外)您可以检查此会话变量。如果存在,则用户已登录。如果不存在,则表示新用户或会话 cookie 过期的用户(已注销)。在这两种情况下,您只需重定向到登录页面。就这样。

此外,不建议session_destroy()从常用代码调用。


推荐阅读