为不再有效的所有用户添加注销时间(关闭浏览器或标签页)

时间:2016-03-24 17:24:47

标签: php time sleep logout

我将在我的网络上运行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仍然是0 cron作业更新的位置),请向logout_time中的ap_login_history添加时间戳。 {1}}表。

这是我的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%成功?也许甚至可以清理一下?

提前致谢

1 个答案:

答案 0 :(得分:1)

对于我之前的项目,我没有使用cron job来完成这类工作。我只是在Javascript中使用计时器,并将检查用户的状态,并在每次用户单击链接或处理到其他页面时更新时间。

基本思路是:

  1. 用户登录时,数据库将记录登录日期时间和活动数据时间。 javascript将从预定义的时间(例如300秒)开始倒计时。
  2. 到达时间后,Javasript将提醒消息并强制用户使用重定向页面注销帐户。重定向页面将更新logout_time=now()中的ap_login_history。此外,它将设置current_status=0
  3. 第二个条件 - >当用户刷新或移动到其他页面或链接时,计时器将再次重置。所以不需要做任何退出操作。
  4. 但是,当用户关闭浏览器时,它可能无济于事。

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

    1. 设置一个具有相应用户标识的cookie,例如具有定义时间限制的userID(例如300秒)setCookie References
    2. 每次用户重新加载或转到其他页面时,都会检查cookie是否仍然存在。如果是,则更新cookie的新日期时间,它应与您在上一步中设置cookie的时间相同。如果不是,这意味着您的用户已经处于非活动状态,那么您可以使用javascript重定向页面以注销页面并执行您想要执行的操作,例如更新数据库。
    3. 因此,无需为过期会话设置cron作业。

      希望这可以帮到你!