为所有不再活动的用户添加注销时间(关闭浏览器或选项卡)


Add logout time for all users who are no longer active (closed the browser or tab)

我将在网络上运行一个Cron作业,为未使用注销按钮的用户自动添加"粗略"注销时间。我需要一些帮助来完成最后的编码。

在我的ap_users数据库表中,每个用户都有一个名为current_status的行,它可以是不活动的0,也可以是活动的1。此状态在我的网络的每个页面上都会更新。

我还有一个名为ap_login_history的数据库表,它在用户登录时添加一行,并且有一行loggout_time显示为0000-00-00 00:00:00,直到用户点击注销按钮。

为了修复用户未单击注销按钮时的空闲时间,我将每隔几个小时运行一次Cron作业,将current_status更新为0,等待300秒,查看用户是否仍处于活动状态,然后再次检查更改为0的电子邮件地址是否未更新为1

如果用户不是活动的(即更新返回current_status仍然是由cron作业更新的0),则将时间戳添加到ap_login_history表中的logout_time

这是我的cron作业脚本:

    //// RESET ANY ACTIVE USERS TO NON ACTIVE
$sql = "SELECT * FROM `ap_users` WHERE `current_status` = '1'";
 $result = $conn->query($sql);
  if ($result->num_rows > 0) {
 // output data of each row
while($row = $result->fetch_assoc()) {
        $user_id = $row['user_id'];
        $email_address[] = $row['email_address'];
        mysqli_query($conn, "UPDATE `ap_users` SET `current_status` = '0' WHERE `current_status` = '1' AND `user_id` = '$user_id'");                                        
}
}
//// GIVE USERS A CHANCE TO SHOW AS ACTIVE IF STILL LOGGED IN
sleep(300);
$timestamp = date("Y-m-d H:i:s");
//// UPDATE LOGOUT TIME FOR USERS WHO ARE NO LONGER ACTIVE
foreach ($email_address as $value) {
    $sql = "SELECT * FROM `ap_users` WHERE `current_status` = '0' AND email_address = '$value'";
 $result = $conn->query($sql);
  if ($result->num_rows > 0) {
 // output data of each row
while($row = $result->fetch_assoc()) {
        $email_address = $row['email_address'];
        mysqli_query($conn, "UPDATE `ap_login_history` SET `logout_date` = '$timestamp' WHERE `email_address` = '$email_address' AND `logout_date` = '0000-00-00 00:00:00'");                                       
}
}
}

这个脚本确实有效,尽管它在sleep()设置下是有脾气的。任何低于130的操作都将成功,再成功也将导致内部服务器错误。在这里使用sleep()函数确实不是一个好主意。

有没有其他方法可以控制这里的等待时间,或者在100%成功的情况下执行此功能?也许会稍微清理一下?

提前感谢

对于我以前的项目,我没有使用cron作业来做这种类型的工作。我只是在Javascript中使用了一个计时器,每次用户点击链接或处理其他页面时,我都会检查用户的状态并更新时间

基本思想是:

  1. 当用户登录时,数据库将记录登录日期时间和活动数据时间。javascript将从预定义的时间开始倒计时(例如300秒)
  2. 到达时间后,Javasript将发出消息,并强制用户使用重定向页面注销帐户。重定向页面将更新ap_login_history中的logout_time=now()。此外,它将设置current_status=0
  3. 第二个条件->当用户刷新或移动到其他页面或链接时,计时器将再次重置。因此无需执行任何注销操作

然而,当用户关闭浏览器时,这可能没有帮助。

因此,我建议您为每个用户设置一个cookie或会话。基本步骤是:

  1. 设置具有相应用户标识的cookie,例如具有定义时限(例如300秒)的userID setCookieReferences
  2. 每次用户重新加载或转到其他页面时,您都会检查cookie是否仍然存在。如果是,您将新的日期时间更新到cookie中,它应该与您在上一步中设置cookie相同。如果没有,这意味着你的用户已经不活跃,那么你可以使用javascript将页面重定向到注销页面,并做你想做的事情,比如更新数据库

因此,没有必要为过期会话设置cron作业。

希望这能帮助到你!