Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript PHP自动注销会话中的用户_Javascript_Php_Session - Fatal编程技术网

Javascript PHP自动注销会话中的用户

Javascript PHP自动注销会话中的用户,javascript,php,session,Javascript,Php,Session,我有一个多用户登录的阵列。我想注销已停用XX次的用户 让我解释一下情况。我有一台个人电脑,人们可以启动和停止他们的任务。我存储他们的id,这样他们可以在活动用户之间切换,以快速停止、启动和查看有关其任务的信息。有时,很多人只使用这台电脑开始他们的任务并继续在另一个工作区中工作,因此活动用户列表将快速增长,而其他人必须在活动用户列表之间搜索以找到自己的用户id 用户ID列表: 4700、7100和2526是登录/激活的用户id 这是我的会话中的数组: 'timestamp' =>

我有一个多用户登录的阵列。我想注销已停用XX次的用户

让我解释一下情况。我有一台个人电脑,人们可以启动和停止他们的任务。我存储他们的id,这样他们可以在活动用户之间切换,以快速停止、启动和查看有关其任务的信息。有时,很多人只使用这台电脑开始他们的任务并继续在另一个工作区中工作,因此活动用户列表将快速增长,而其他人必须在活动用户列表之间搜索以找到自己的用户id

用户ID列表:

4700、7100和2526是登录/激活的用户id

这是我的会话中的数组:

'timestamp' => 
    array (size=3)
      4700 => int 1557473018
      7100 => int 1557472637
      2526 => int 1557473020
我发现了很多用户注销脚本,但所有脚本都基于1个用户

它与PHP一起工作,但我希望它与javascript一起自动工作

我已经试过了

  <script language='javascript'>
  var timeout = 60 * 1000; // 10 seconds  

  var lastAction = <?php echo isset($_SESSION['timestamp']) ? $_SESSION['timestamp'] : time();?>;
  var timer = function(){
     return setInterval(function(){
        var now = new Date();
        if (typeof lastAction !=='undefined' ){
          if(now.getTime() - lastAction >= timeout ){
             alert('have been logged out');
             <?php afmelden($Ids); ?>
          }
        }
      }, 1000) // repeat every 1 second;
  }
  window.onmousemove = function(e){
   clearInterval(timer);
   timer();   
  }
  window.onclick= function(e){
    clearInterval(timer);
    timer();
  }

  // and make initial call
  timer();
</script>

变量超时=60*1000;//10秒
var lastAction=;
变量计时器=函数(){
返回setInterval(函数(){
var now=新日期();
如果(上次操作的类型!=='undefined'){
if(now.getTime()-lastAction>=超时){
警报(“已注销”);
}
}
},1000)//每1秒重复一次;
}
window.onmousemove=函数(e){
清除间隔(计时器);
定时器();
}
window.onclick=函数(e){
清除间隔(计时器);
定时器();
}
//打个电话
定时器();

如果您有许多活动用户,则将服务器轮询到数据库可能会导致大量流量。在这里,我能想到的最佳解决方案是将时间戳添加到memberme令牌中。对于这个例子,我将使用

当用户登录时,请创建令牌以保存所需的任何信息:

session_start();

$_SESSION['ssid'] = \Firebase\JWT\JWT::encode(array(
    'exp' => 1557738566 // Your expiration time from the DB
    'uid' => 1 // User ID the account is using
    'obj' => array() // Anything else you want to store in cache
));
我们现在需要将请求发送到服务器以查看任何更改

( ( $ ) => {
    var timer = () => {
        setInterval( () => {
            $.get( '/your/route' ).done( ( resp ) => {
                // resp will hold time left, current uid and any other
            } );
        }, 1000 );
    }
} )( JQuery );
服务器的简单用法可以是:

session_start();
header('Content-Type: application/json');

if(isset($_SESSION['ssid'])) {
    try {
        // TODO: Check the exp and log user out if expired
        die(json_encode(\Firebase\JWT\JWT::decode($_SESSION['ssid'], array())));
    }
    catch (Exception $e) {
        // bearer was invalid or expired - log them out
    }

    return;
}

// Redirect them to login
如果您需要根据用户操作更新时间,您可以更新令牌中的时间,如果需要,还可以更新DB中的时间

想法:

我之所以这样说,是因为拥有像
afmelden($Ids)
这样的开放路由不会阻止某人在浏览器中使用任何想要的ID直接访问该路由,除非该路由具有RBAC


好啊那么,你尝试的东西出了什么问题?@ADyson我用PHP编写了它。刷新页面时,它将检查非活动用户。我想让它自动,但我不知道如何。。。这里的脚本给了我不停的提醒,即使我将计时器设置为24小时。一个明显的问题可能是PHP以秒为单位返回时间,而JavaScript以毫秒为单位返回时间。。。如果您已经将生成的值记录到控制台中,您可能已经注意到了这个巨大的差异?我看到了差异。PHP Time()是:1557739523 Javascript getTime()是:1557739523400好的,希望您现在意识到如何解决这个问题?