我用PHP创建了一个项目,在其中管理会话。
我正在我的config.php文件中通过编写以下代码行创建会话。
session_start();
为了销毁这个会话,我在logout.php文件中写了以下行。
session_destroy();
我在任何其他项目文件中都没有提到会话的任何代码,但问题是会话是活动的,直到我调用logout.php,
我想要的是,如果用户处于非活动状态15分钟,会话应该过期。
有人能帮我吗,我是PHP新手,请给出一些示例代码或链接来实现这一点。。
在头文件中调用下面的函数,这样每当用户在该时间进行任何活动时,页面都会被刷新,并检查会话是否超时。
function auto_logout($field)
{
$t = time();
$t0 = $_SESSION[$field];
$diff = $t - $t0;
if ($diff > 1500 || !isset($t0))
{
return true;
}
else
{
$_SESSION[$field] = time();
}
}
在标题中使用类似的内容
if(auto_logout("user_time"))
{
session_unset();
session_destroy();
location("login.php");
exit;
}
User_time是会话名称。我希望这个答案能对你有所帮助。这个代码实际做的是:"检查diff是否大于1500秒。如果不大于1500秒,则设置新的会话时间。"您可以根据需要更改时间diff(1500)。
尝试
ini_set('session.gc_maxlifetime',54000);
ini_set('session.gc_probability',1);
ini_set('session.gc_divisor',1);
在调用session_start()之前使用此选项
将time()
存储在$time
变量中。创建名为$setTime
的变量,并设置希望用户超时的时间。
之后,检查条件,即如果$_SESSION['setTime']
为空或未设置,则将超时值存储到会话中,否则当页面刷新时,新值将分配给$_SESSION['setTime']
。
$time = time ();
$setTime = time () + 60;
if (empty ( $_SESSION ['setTime'] ) || !isset ( $_SESSION ['setTime'] )) {
$_SESSION ['setTime'] = $setTime;
}
之后,检查当前时间是否大于存储的时间。并且如果它未设置会话。也破坏会话。
if (time () >= ( int ) $_SESSION ['setTime']) {
session_unset ();
session_destroy ();
}
您可以使用类似的东西
# Session Logout after in activity
function sessionX(){
$logLength = 1800; # time in seconds :: 1800 = 30 minutes
$ctime = strtotime("now"); # Create a time from a string
# If no session time is created, create one
if(!isset($_SESSION['sessionX'])){
# create session time
$_SESSION['sessionX'] = $ctime;
}else{
# Check if they have exceded the time limit of inactivity
if(((strtotime("now") - $_SESSION['sessionX']) > $logLength) && isLogged()){
# If exceded the time, log the user out
logOut();
# Redirect to login page to log back in
header("Location: /login.php");
exit;
}else{
# If they have not exceded the time limit of inactivity, keep them logged in
$_SESSION['sessionX'] = $ctime;
}
}
}
但请记住函数sessionX()必须在session_start()之后
请参阅此处的详细信息
我知道这是一个已经回答的问题,但我只是想分享我的经验,因为我觉得这是一种更容易的方法。我不确定这是否是最好的方式,但还是这样吧。我所做的是:
-
当用户登录时,我将PHP会话($_Session['timeout'])设置为当前时间(time())。
-
编写以下函数来验证用户是否处于活动状态。
函数会话超时(){
//此功能将在用户上次活动时之前注册的时间基础上增加900秒(15分钟,这是您希望用户//处于非活动状态以自动注销的时间量)。//然后,它检查当前时间是否大于您希望用户//保持登录而不超时的时间(即15分钟)。如果它更大,那么您将被重定向到//登录页面,在那里您可以使用http://www.yourwebpage/login.php?status=timeout在URL上。
if($_SESSION['timeout']+900>时间()){
// User Active so reset time session. $_SESSION['timeout'] = time();
}其他{
// session timed out then redirect to login page header('Location:http://'. $_SERVER[HTTP_HOST] . '/login.php?status=timeout');
}
}
最后:调用sessionTimeOut();函数。这允许每次用户刷新或导航到新页面时调用该函数。因此,它非常有效(至少在我的情况下),满足了我的目的,所以我想我会和你们分享它。
这是Kamal发布的内容的延续。我尝试了相同的代码,但通过如下修改使其发挥作用:
/* code */
function fnlogout($field)
{
$t = time();
if (!isset($_SESSION[$field]))
$_SESSION[$field] = time();
$t0 = $_SESSION[$field];
$diff = $t - $t0;
if ($diff > 60)
{
return true;
}enter code here
else
{
return false;
}
}
function fnheader()
{
if(fnlogout("user_time"))
{
session_unset();
session_destroy();
header("location:index.php?action=expired");
exit;
}
}
是的,Kamal对代码插入的位置是正确的。一部分作为函数,另一部分在每个文件的头或公共头函数中。