我是一名PHP初学者。我设法创建了一个用户注册/注册系统,该系统通向仪表板面板。用户使用会话登录。
我制作了一个会话时间脚本,使会话在30分钟后过期。但我的问题是如何只在用户处于非活动状态时使其过期,并且如果用户激活,则突然如何防止其过期。
这是我的登录代码和仪表板代码。请帮帮我。编码帮助将非常感激。
谢谢
#登录代码
$_SESSION['username'] = $username;
$_SESSION['emailAddress'] = $email;
$_SESSION['LoggedIn'] = 1;
$_SESSION['start'] = time(); // taking now logged in time
$_SESSION['expire'] = $_SESSION['start'] + (1 * 10) ;
header('Location: ../dashboard/');
#DASHBOARD代码
session_start();
if(empty($_SESSION['LoggedIn']) && empty($_SESSION['username']))
{
echo "<script>location.href='session-expired.php'</script>";
}
elseif(!isset($_SESSION['LoggedIn']) && !isset($_SESSION['username']))
{
echo "<script>location.href='session-expired.php'</script>";
}
else
{
$now = time();
if($now > $_SESSION['expire'])
{
session_destroy();
echo "<script>location.href='session-expired.php'</script>";
}
else
{
?>
<!-- After all the html codes --!>
<?php
}
}
?>
答案 0 :(得分:1)
如果用户变为活动状态,那么他/她将再次点击页面,这就是您想要移动会话过期时间的时间。如果您有所需页面使用的包含文件(例如标题包含),则可以放置这些行
$_SESSION['start'] = time(); // taking now logged in time
$_SESSION['expire'] = $_SESSION['start'] + (1 * 10) ;
进入包括。
答案 1 :(得分:0)
我建议您阅读这个问题的优秀回复:How do I expire a PHP session after 30 minutes?
但总结一下这个问题的想法(并实际回答你的问题):
不信任php ini配置,自动过期不会在每个请求上运行而您不希望它(它运行在磁盘上的每个会话,而不仅仅是当前的会话)。
请勿从开始时间更新$_SESSION['expire']
值。从当前时间更新它。这使它更接近“x不活动时期”的实际行为。
当您的代码结束时,您应始终die
或exit
。当您执行重定向时,您已经确定当前页面已完成,并且您希望其他页面接管当前请求。
尽量不要将<script>location.href=</script>
用于重定向。您应该坚持使用登录代码中使用的服务器端重定向,如下所示:header('Location: ../dashboard/');
。这有几个原因。
echo
或print
或dumps
或<?php ?>
标记之外的任何内容。这些都将数据发送到客户端,一旦启动,您就无法在服务器上执行某些操作。这导致了php devs "headers already sent" [session_destroy][8]
的文档可以这样说:
为了完全终止会话,要将用户注销,还必须取消设置会话ID。如果使用cookie来传播会话ID(默认行为),则必须删除会话cookie。 setcookie()可以用于此。
他们没有详细说明如何取消设置会话ID,但它是这样的:
session_start();
session_unset();
session_destroy();
session_write_close();
// if using coookies
setcookie(session_name(),'',0,'/');
session_regenerate_id(true);
所以我会为您的#DASHBOARD CODE
执行此操作session_start();
if(!isset($_SESSION['LoggedIn']) || empty($_SESSION['LoggedIn']) || !isset($_SESSION['username'] || empty($_SESSION['username']))
{
header("Location: /session-expired.php");
exit();
}
else
{
$now = time();
if($now > $_SESSION['expire'])
{
session_start();
session_unset();
session_destroy();
session_write_close();
// if using coookies
setcookie(session_name(),'',0,'/');
session_regenerate_id(true);
header("Locaiton: /session-expired.php");
exit();
}
else
{
$_SESSION['expire'] = $now + 10;
}
}
另请注意:
time()
使用秒,因为你提到你是PHP的新手。time()
也处理Unix时代,所以请注意year 2038。