Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.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
Php 定时自动注销和浏览器关闭_Php_Jquery_Logout - Fatal编程技术网

Php 定时自动注销和浏览器关闭

Php 定时自动注销和浏览器关闭,php,jquery,logout,Php,Jquery,Logout,为了学习,我创建了一个非常简单的多用户游戏 当用户登录时,每个其他用户都会获得当前登录的所有用户的更新 当用户登录时,它只是将SQL数据库中该用户的值设置为1。当他们注销时,该值应为0 我正在使用$(window.unload(function(){});尝试捕捉选项卡/浏览器关闭,但只起到了一定的作用 两个问题: 是否有更好的方法来捕获浏览器或选项卡关闭 如果它错过了选项卡关闭,或者他们的机器崩溃,或者互联网连接中断,或者用户只是离开了机器,我想继续并自动将他们注销 我正在使用带有PHP后端的

为了学习,我创建了一个非常简单的多用户游戏

当用户登录时,每个其他用户都会获得当前登录的所有用户的更新

当用户登录时,它只是将SQL数据库中该用户的值设置为1。当他们注销时,该值应为0

我正在使用$(window.unload(function(){});尝试捕捉选项卡/浏览器关闭,但只起到了一定的作用

两个问题:

  • 是否有更好的方法来捕获浏览器或选项卡关闭

  • 如果它错过了选项卡关闭,或者他们的机器崩溃,或者互联网连接中断,或者用户只是离开了机器,我想继续并自动将他们注销

  • 我正在使用带有PHP后端的HTML/Jquery前端。我能做些什么来完成第二个问题?我想我需要用PHP来做。。我们的工作假设浏览器可能不再存在,因此不会处理jquery内容。PHP可以在一个连续计时器上做一些事情,检查用户是否还在附近。。。而不是让用户每10秒点击一个按钮

    编辑: 这里有一个潜在的解决方案: 但是我使用ajax来避免页面刷新。理想情况下,用户将永远不会f5页面,或单击任何按钮(我正在测试,记住,这不是一个真正的应用程序)。PHP是否会在不刷新整个页面的情况下看到最后一个活动

    Edit2: 我已经在PHP中添加了以下代码,并使用setInterval使用了相应的jquery函数

    if (isset ($_POST['keepalive'])) {
        if (filter_input(INPUT_POST,'keepalive') == '1') {
            $name = $_SESSION['name'];
            $time = time();
            mysql_query("UPDATE tictac_names SET keep_alive = '$time' WHERE name ='$name'") or die(mysql_error());
        }   
    }
    
    这将在我的表中插入一个unix epoc时间戳,这对于简单的计算来说非常容易

    我现在的问题是:如何让PHP在X秒的时间内为每个登录用户运行检查?我的PHP后端文件主要设置为捕获post变量并运行代码,然后将其交还给jquery。由于这段代码旨在注销非活动浏览器/用户,所以我不能依赖jquery向PHP发送请求,并且PHP并没有更新。我是否需要做一些cron工作或者做一些奇怪的事情来让PHP检查在过去X秒内没有更新的所有用户


    救命啊

    我不知道第一个问题,但第二个问题的建议如何:

    当用户处于“活动”状态时,他们是否会定期引发页面请求?如果是这样的话,您可以有一个系统,让登录的用户定期登录到您的SQL数据库中,并带有时间戳。然后让另一个脚本查找所有时间戳早于指定时间段(不管您喜欢什么,例如10秒)的用户,并将其设置为“0”

    我可以建议一些代码,但也许这不是你想要的-让我知道


    编辑:好的,你编辑的链接似乎已经得到了与我刚才建议的类似的系统的回复。如果您使用AJAX,您可以在后台定期调用php脚本来设置和检查SQL表中的时间戳。

    您可以实现基于$\u会话的解决方案,如。然后您可以调整它以处理您的数据库需求。

    如果您使用html5套接字连接作为连接到服务器的方式,那么套接字服务器脚本将知道订阅者何时断开连接。这还允许您将数据实时推送到所有客户端,而无需长时间轮询。唯一的问题是,我不知道目前对html5套接字的支持是什么。我使用Flash做了类似的事情,它也支持套接字连接。

    在用户登录时,不只是设置一个标志,而是记录一个可以用来确定登录时间的时间戳。此外,您还可以让您的客户机使用AJAX调用一些PHP脚本在数据库中保存上一次用户活动的时间戳


    然后,可以使用服务器中的cron作业定期执行会话清理器脚本。脚本将查询数据库以检测过时会话并注销(将logged-on标志设置为0)。如果服务器安装了PHP CLI(命令行界面),则可以用PHP编写脚本。

    只有在用户关闭窗口后才返回站点的用户才可以使用数据库获取用户ID、IP和时间,如下所示:

    $_SESSION['ip'] = $_SERVER['HTTP_CLIENT_IP'];
    if(isset($_SESSION['ip'])){
        if(Logedin){ // This login detection can be set by cookies can very depending on situation
            mysql_query("INSERT INTO users SET user_login=\"".'1'."\",user_id=\"".$idfromlogin."\",user_ip=\"".$_SESSION['ip']."\",user_time=\"".time();."\"");
        }
    
    然后,我们可以在每次加载页面时对照
    time()如果用户通过“X”按钮关闭窗口,则会话结束。现在我们必须开始一个新的会话,但这就是我们在数据库中节省时间的原因

    $_SESSION['ip'] = $_SERVER['HTTP_CLIENT_IP'];
    if(isset($_SESSION['ip'])){
        if (!$sql = mysql_query("SELECT * FROM users WHERE user_ip=".$_SESSION['ip'])){
            die('Error: ' . mysql_error());
        }
    
        $row = mysql_fetch_array($sql);
        if ($row['user_time'] + 10 * 60 < time()){ // this is 10 minutes have passed
            // now to find the user database by the session database the logins is your method of loging in a user from logins database with pass and name
            if (!$user = mysql_query("UPDATE logins SET user_isloggedin=\"".'0'."\" WHERE user_id=".$row['user_id'])){ //from the users database
                die('Error: ' . mysql_error());
            }
        }
    

    我假设,用户在注销时显示为在线和离线。销毁会话或cookie需要客户端浏览器处于工作模式

    解决方案

    我还假设维护了一个timestamp列。设置间隔以检查当前TS和最后一个时间戳之间的时间间隔。同时根据您的id将您自己的TS更新为当前TS

    setInterval(function(){ 
        $.ajax({
            url: "/backend.php?userid=id",
            success: function(resoponse){
                console.log(response);
            }
        });
    }, 10000);
    
    backend.php

    $user_id = $_GET["userid"];
    $query = "select * from table name where (GETDATE() - timestamp) > 60";
    $resut = mysqli_query($con, $query);
    while($row = mysqli_fetch_assoc($result)){
        //set there status = 0 as offline
        $other_user_id = $row['user_id'];
        mysqli_query($con, "update tablename set status = 0 where user_id = '$other_user_id'");
    }
    //update your own timestamp
    mysqli_query($con, "update tablename set timestamp = GETDATE() where user_id='$user_id'");
    
    这将检查用户活动,或者基本上检查js是否正在运行。如果浏览器已关闭,则该用户的TS将不会更新,因此GETDATE()-时间戳将大于60。现在,运行web应用程序的其他用户也将运行相同的脚本,根据条件检查并更新所有用户的状态。 当用户关闭他的标签时,他至少会在线1分钟


    我遇到了一个类似的问题,并在这里找到了解决方案。

    请访问tenthower.com以了解它的实际情况。
    $user_id = $_GET["userid"];
    $query = "select * from table name where (GETDATE() - timestamp) > 60";
    $resut = mysqli_query($con, $query);
    while($row = mysqli_fetch_assoc($result)){
        //set there status = 0 as offline
        $other_user_id = $row['user_id'];
        mysqli_query($con, "update tablename set status = 0 where user_id = '$other_user_id'");
    }
    //update your own timestamp
    mysqli_query($con, "update tablename set timestamp = GETDATE() where user_id='$user_id'");