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

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

我将在我的网络上 运行 一个 Cron 作业,为没有使用注销按钮的用户自动添加一个 "rough" 注销时间。我需要一些关于最终编码的帮助。

在我的 ap_users 数据库 table 上,每个用户都有一行名为 current_status,可以是 0 表示不活跃或 1积极的。此状态会在我网络的每个页面上更新。

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

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

如果用户不活跃(即 current_status 的更新 returns 仍然是 0 它由 cron 作业更新的位置)添加时间戳到 logout_timeap_login_history table.

这是我的 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 job来完成这类工作。我只是在 Javascript 中使用了一个计时器,并且会在每次用户单击 link 或处理其他页面时检查用户的状态并更新时间。

基本思路是:

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

但是,当用户关闭浏览器时,它可能没有帮助。

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

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

因此,无需为过期会话设置 cron 作业。

希望对您有所帮助!