我有网站所有用户的日志表
我在成功登录后立即记录有关用户的各种数据。
如果 signout_dt
字段未填写且 status
对于某些 user_id
为 1,网站会自动阻止登录。
对于那些有 cookie 的人 - 没有问题。
问题是,假设用户在没有 cookie 的情况下登录:只有 session 变量。我不知道,如果 30 分钟不活动,我该如何更新数据库表并注销用户。请注意,我无法创建 cron 作业或服务器端的东西,因为使用共享主机。
听说,可以创建一些像 heartbeat 这样的脚本,不断发送一些有关用户事件的数据。但我认为这会给服务器带来沉重的负载,尤其是当用户超过 1000 人时。有什么建议、教程、文章或其他内容吗?
更新
Deceze 试图解释,但我真的需要更好的解释(更好的主意)和代码。
最佳答案
要“暂停”用户,只需记下他最后一次出现的时间。然后,必要时,检查您最后一次看到用户的时间是否超过 x 分钟/小时/天,并考虑最后一次 session 超时。您不需要运行 cron 作业或任何在用户之后实时清理的东西,您只需要能够在需要时确定某些信息是否应该被视为陈旧。
您可能偶尔想运行一个 cron 作业或其他东西来清除旧的、不必要的数据,但这不需要实时发生。您甚至可以将其作为常规页面请求的一部分运行:
if (mt_rand(1, 1000) == 1) {
mysql_query('DELETE FROM `table` WHERE `last_seen` < some point in time');
}
要记录上次查看时间,只需在每次页面加载时运行此查询:
UPDATE `table` SET `last_seen` = NOW() WHERE `user_id` = ...
为了避免这些查询对数据库造成冲击,您也可以每隔一段时间就这样做一次。在用户 session 中保留一个“last_seen_last_updated”时间戳,然后在每次加载页面时检查是否要更新数据库:
if ($_SESSION['last_seen_last_updated'] < strtotime('-5 minutes')) {
mysql_query(...);
$_SESSION['last_seen_last_updated'] = time();
}
这会给您带来 5 分钟的抖动,但这通常是完全可以接受的。
关于php - 根据用户事件更新数据库表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9206799/