删除过期会话

Removing Expired Sessions

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

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

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

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

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

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

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

?>

session_start()session_destroy() 并没有像您想象的那样使用垃圾收集器。他们利用内部适配器允许 PHP 与持久层(通常是文件系统,在本例中为浏览器 cookie)对话,以提取会话信息。

当您调用 session_destroy() 时,您在做什么,是在指示您的会话适配器销毁会话,而不是 PHP。 PHP 垃圾不断收集会话内存使用情况,但仍保持对会话数据的适配器持久性的引用。

所以,是的,你必须调用它,除非你已经销毁了它。

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

session_start() 将始终开始或恢复会话,并且此会话将始终为 "alive"。不过,此会话是否具有已登录用户的标志取决于您。

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

此外,从常规代码 isn't recommended 调用 session_destroy()