删除过期会话
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()
。
这是我第一次发帖。我相信我已经搜索了一些其他论坛,看看是否已经有人问过我的问题,但我仍然摸不着头脑。我知道有很多关于过期会话的帖子,但我想我是在考虑特定情况。
用户登录到仪表板并转到页面。它闲置了多长时间,然后垃圾收集器开始工作并清除会话。
现在,如果用户返回仪表板并单击转到另一个页面,我想让用户 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()
。