【问题标题】:User Inactivity Logout PHP用户不活动注销 PHP
【发布时间】:2011-03-05 09:04:24
【问题描述】:

我希望我的用户在 X 分钟不活动后自动注销。我也想销毁所有会话。

如何做到这一点?如何检查不活动状态然后执行功能将它们注销???

【问题讨论】:

    标签: php session timeout logout user-inactivity


    【解决方案1】:

    最简单的方法是这样。如果用户没有激活您网站上的某些元素,则将用户发送到注销页面

    $secondsWait = 300; // these are seconds so it is 300s=5minutes
    header("refresh:$secondsWait; logout.php");
    

    重定向的内容... logout.php,销毁所有会话,还可能发送一条消息提醒用户他们退出的原因

    <?php
    session_start();
    session_unset();
    session_destroy();  
    ?>
    

    【讨论】:

      【解决方案2】:

      这就是我的做法:

      //set timeout period in seconds
      $idleTime= 60*2;
      //check to see if $_SESSION['timeout'] is set
      if(isset($_SESSION['timeout'])){
      $session_life = time() - $_SESSION['timeout'];
      if($session_life > $idleTime){
      // your logout code here*
           }
      }
      $_SESSION['timeout'] = time();
      

      这使得 $_SESSION['timeout'] 每次重新加载页面时都会重置,我在每个子页面标题的包含文件中都有这个,至少对我有用。

      【讨论】:

        【解决方案3】:

        您可以通过 $_SESSION['lastactive'] = time() 设置上次活动时间,并在用户每次导航到新页面时更新它。然后你可以在每个页面上都有一个函数 timeout() 。

        function timeout()    
        {
            $maxtime = 60*2; // Here , maxtime has been set to 2 minutes
        
        if(isset($_SESSION['lastactive']) and (time() - $_SESSION['lastactive'] > $maxtime )) // subtracting current time from lastactive time and seeing if it exceeded timeout limit.
        {
            signout(); //logging out        
        }
        
        if(isset($_SESSION['lastactive']) and (time() - $_SESSION['lastactive'] < $maxtime )) // subtracting current time from lastactive time and seeing if it exceeded timeout limit.
        {   
            return 1; // timeout limit not exceeded     
        }   
        else
        {
            if(!isset($_SESSION['lastactive']))
            {
        
                $_SESSION['lastactive'] = time(); //if lastactive is not set
            }
        }
        }
        

        【讨论】:

          【解决方案4】:


          $(文档).ready(函数()
          {
          setTimeout(function() { CALL LOGOUT.PHP VIA AJAX }, 720000);

          });

          720000 表示 12 分钟(用于说明目的)
          将此脚本放在您的标题中并设置您自己的不活动时间
          你可以设置你想要的时间,它会像 如果您设置 5 分钟,那么当您登录系统时,它会开始计数 5 分钟。但是如果你点击任何模块,这个脚本将被重新加载,因为当页面翻页时,标题也会在脚本重新加载时重新加载,然后它从 0(初始)开始计数,但如果你无法在 5 分钟内访问系统。然后它将加载logout.php,系统将注销

          【讨论】:

            【解决方案5】:

            使用unset($_SESSION['NAME']);session_destroy();。您还可以更改会话的值。

            要在某个时间执行此操作,您需要在数据库中设置一个时间戳,然后调用它来检查它是否超过 X 分钟。查看底部的链接。

            我个人只是使​​用 cookie 并让它们在某个时间过期,但不管你的船是什么。

            If current time is more than 30 seconds past time X (from the database)

            【讨论】:

              【解决方案6】:

              我厌倦了 Michiels 的接近,却无处可去。 在调查中,我看到 if 语句只是将过期时间添加到当前时间,因此该语句从未触发。

              这是我修改后的版本:

              在登录用户或加载安全页面时设置:

               $_SESSION['expire'] = time()+1*60;
              

              并使用它来查看到期时间是否小于当前时间(即我们超过了到期限制):

              if(time() > $_SESSION['expire']){
               $user -> logout();
              }
              

              【讨论】:

                【解决方案7】:

                PHP 的会话机制已经有一个基于不活动超时的垃圾收集器。你不用担心。

                【讨论】:

                • 有点误导 - 垃圾收集与会话何时被禁用无关 - 只有时间(稍后)数据被清除。答案是会话生命周期(令人困惑的是,它以 gc_ 为前缀)
                【解决方案8】:

                你也可以这样做:

                $_SESSION['loginTime'] = time();
                

                在每个页面上,当用户尝试导航并且他已经闲置了 20 分钟时,您可以像这样将他注销:

                if($_SESSION['loginTime'] < time()+20*60){ logout(); }
                

                【讨论】:

                  【解决方案9】:

                  您可以设置会话超时限制,例如:

                  ini_set('session.gc_maxlifetime',30);
                  

                  Here is the possible solution for you.

                  【讨论】:

                    【解决方案10】:

                    根据您的服务器的速度和您拥有的用户数量,您可以让它在用户执行任何操作(导航、单击按钮等)时向您的服务器发送请求。根据这个请求,用他们的最后活动时间更新一个 SQL 表。

                    让一个 cron 作业定期在表中运行,并删除在阈值范围内处于非活动状态的用户的会话。

                    如果您的服务器很慢或者您有很多用户,您可以不经常运行此脚本。

                    【讨论】:

                    • 这根本不是一个有效的解决方案。
                    猜你喜欢
                    • 2015-08-18
                    • 1970-01-01
                    • 2023-03-16
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-08-04
                    • 2014-09-28
                    相关资源
                    最近更新 更多