如何在php中进行自动注销

How can make automatic logout in php

本文关键字:注销 php      更新时间:2023-09-26

我通过登录/注销来创建web。

如果在web上按下任何链接或按钮,我会调用ajax函数来检查登录情况,如果时间过期,则注销用户。在注销功能中,我更新我的数据库。

但如果我关闭浏览器或页面,用户不会注销,数据库也不会更新。如何为其添加事件侦听器。

PHP文件

if (isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];
    switch ($action) {
        case "checkLogin":
            echo isLogged();
            break;
        case "logout":
            logout();
            break;
         //and more
    }
}
function isLogged() {
    $data = array(
        "login"     => 0,
        "username" => "null"
    );
    if(isset($_SESSION["user"]) && isset($_SESSION["start"])) {
        $session_start = $_SESSION["start"];
        //more then 600 sec
        if(time() - $session_start < 600){
            $data = array(
                "login"     => 1,
                "username" => $_SESSION["user"]
            );
        }else{
            logout();
        }
    }
    return json_encode($data);
}
function logout(){
    if(isset($_SESSION["user"])) {
        $connection = connectToDB();
        if($connection != null) {
            $nickname = $_SESSION["user"];
            $time = date("Y-m-d H:i:s");
            $sql_statement = "UPDATE users SET is_login='0',last_login='$time' WHERE username='$nickname';";
            $connection->query($sql_statement);
        }
        session_destroy();
    }
}

没有可靠的方法来"监听"用户关闭你的窗口,或者,正如@Taplar所指出的,关闭他们的计算机。使用本问题中描述的在会话中存储登录时间的技术,您可以运行cron或其他类型的后台任务,检查数据库中是否有将要过期的会话,然后在那里过期。

您可以使用async-false添加unload侦听器,因此浏览器将在请求未完成时等待:

$(window).unload(function() {
    $.ajax({
        type: 'GET',
        url: '/logout',
        async: false
    });
});

请注意,浏览器在请求期间会"挂起",这可能会混淆用户