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

Posted

技术标签:

【中文标题】为不再活动的所有用户添加注销时间(关闭浏览器或选项卡)[重复]【英文标题】:Add logout time for all users who are no longer active (closed the browser or tab) [duplicate] 【发布时间】:2016-07-12 09:44:30 【问题描述】:

我将在我的网络上运行 Cron 作业,以自动为未使用注销按钮的用户添加“粗略”注销时间。我需要一些关于最终编码的帮助。

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

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

如果用户没有点击注销按钮,为了修复空闲时间,我将每隔几个小时运行一次 Cron Job 以将 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% 成功?甚至可以稍微清理一下?

提前致谢

【问题讨论】:

【参考方案1】:

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

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

但是,当用户关闭浏览器时,它可能无济于事。

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

    设置具有相应用户标识的 cookie,例如具有定义时间限制的用户 ID(例如 300 秒)setCookie References 每次用户重新加载或转到其他页面时,您都会检查 cookie 是否仍然存在。如果是,您将新的日期时间更新到 cookie,它应该与您在上一步设置的 cookie 相同。如果否,则表示您的用户尚未处于活动状态,那么您可以使用 javascript 重定向页面以注销页面并执行您想做的事情,例如更新数据库。

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

希望对你有帮助!

【讨论】:

即使用户也关闭了页面,这也能工作吗? 我会支持这个,除非它不适用于使用 noScript 或禁用 javascript 的人。 关闭页面就不行了。 我添加了另一种方法,因为当用户关闭页面时第一种方法可能不起作用。但是,第二种方法是使用 cookie。但是,当您的用户禁用 cookie 时,这将是另一个问题。您也可以强制您的用户存储 cookie。

以上是关于为不再活动的所有用户添加注销时间(关闭浏览器或选项卡)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Rails设计gem:强制注销浏览器选项卡关闭

如何在关闭浏览器选项卡或浏览器时插入数据[重复]

当用户直接关闭浏览器时如何跟踪注销活动

如何从管理员端注销所有活动的登录用户

更改密码或关闭标签后注销用户

当用户在页面 javascript 或 php 中不活动 3 分钟时自动注销