PHP在10分钟不活动后自动注销


PHP auto-logout after 10 mins of inactivity

目前我正在使用下面提到的PHP代码跟踪用户在网站上花费的时间:

if (!isset($_SESSION[timeset1]))
{
$one_val = time();
$_SESSION[timeset_dummy]= $one_val; 
$two_val = time()+1;
  $_SESSION[units_all] = array
  (
   "year"   => 29030400,
   "month"  => 2419200,
   "week"   => 604800,
   "day"    => 86400,
   "hr"   => 3600,
   "min" => 60,
   "sec" => 1
  );
}
else 
{
$two_val = time();
}
$diff = abs($two_val - $_SESSION[timeset_dummy]);
foreach($_SESSION[units_all] as $unit => $mult)
   if($diff >= $mult)
   {
    $output .= " ".intval($diff / $mult)." ".$unit.((intval($diff / $mult) == 1) ? ("") : ("s"));
    $diff -= intval($diff / $mult) * $mult;
   }

我想在用户处于非活动状态8分钟后弹出窗口,该会话将在接下来的2分钟内过期。你能建议我如何显示弹出窗口吗(最好不使用Javascript,使用CSS3&HTML5很好)。弹出窗口将有警告消息"Do you want to continue"和一个按钮"Yes",如果按钮在2分钟内没有点击,将自动执行页面注销脚本(PHP)。

任何指向以实现此逻辑的指针。

我发现了一个jQuery插件,看起来它会让你的生活更轻松。它被称为jquery idleTimeout。

该插件有一些配置项目,因此您可以根据自己的需要进行自定义…

  • 不活动:1200000//20分钟默认值(显示通知前的时间)
  • sessionAlive:300000,//5分钟默认点击alive_url的频率,我们用于页面不经常更改的ajax*接口。这有助于防止应用程序的注销屏幕出现在ajax回调中。如果你把这个设置为false,它就不会发送
  • alive_url:'/path/to/your/imHere/url',//向该url发送活动ping
  • redirect_url:'/js_sandbox/',//注销时去哪里
  • click_reset:true,//重置点击超时(对于ajax界面)–重置sessionAlive计时器,因此如果我们只是出于其他原因调用ajax,则不会使用alive_url访问您的应用程序
  • logout_url:'/js_sandbox/timedLogout/index.html'//重定向前注销(url,这样您就可以在重定向到登录屏幕之前完全销毁会话)

这里有一个链接到github页面下载该库。

https://github.com/philpalmieri/jquery-idleTimeout

编辑

在查看源代码时,我还注意到,他们使用jqueryui作为样式表,使其看起来像演示中那样。

据我所知,没有javascript就无法实现您想要的目标。浏览器需要javascript来知道何时打开弹出窗口。您可以使用任何您想要检查超时的方法,无论是基本的window.setTimeout还是更高级的库(如tehAon的答案中的库)。

由于我不能发表评论,我想在这里问:您的代码对于检查用户是否仍然活跃来说似乎非常复杂。你不能使用这样的东西有什么特别的原因吗:

$_SESSION['last_activity'] = time();
function check_if_logged_in() {
    if(time() - $_SESSION['last_activity'] > 600) { // 10 minutes but you could use 480 for 8 minutes
        // Do redirect or take other action here
    }
}
if(time() - $_SESSION['timestamp'] > 900) { //15 minute subtract new timestamp from the old one
        $_SESSION['logged_in'] = false;
        session_destroy();
        header("Location: " . index.php); //redirect to index.php
        exit;
    } else {
        $_SESSION['timestamp'] = time(); //set new timestamp
    }

使用php会话变量很容易做到这一点。

设置带有时间戳的$_SESSION变量,并使用动作时间进行检查

<?php
session_start();
if(time()-$_SESSION['time']>600)
unset($_SESSION['time']);
else
$_SESSION['time']=time();//updating with latest timestamp
?>