删除过期的会话

时间:2019-01-10 16:05:39

标签: php session-cookies

这是我第一次发帖。我相信我已经在其他一些论坛中进行了搜索,以查看是否已经提出了我的问题,但是我仍然挠头。我知道有很多关于过期会话的帖子,但是我想是在特定情况下考虑的。

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

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

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

我想先检查一下会话是否确实还活着。如果不是,请销毁它并重定向到主页。否则,将其删除。

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

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

?>

2 个答案:

答案 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垃圾会不断收集会话内存使用情况,但仍会保留对适配器对会话数据持久性的引用。

因此,是的,除非已销毁它,否则必须调用它。