php - 根据用户事件更新数据库表

标签 php javascript mysql

我有网站所有用户的日志表

enter image description here

我在成功登录后立即记录有关用户的各种数据。

如果 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/

相关文章:

php - 使用 php 在字符串中搜索数百万个术语

javascript - __doPostBack on 事件仅有效一次

php - 将 MySQL 结果作为 PHP 数组获取

javascript - 自动重新加载div容器

javascript - 是否可以使用 CSS/JavaScript 裁剪 div 的背景图像?

Mysql数据库设计一张表多键值行性能如何?

c++ - 使用 Qt 从 mysql 查询构建二维 vector

PHP - 定义常量与使用 config.ini

javascript - 尝试使用 AJAX 和 PHP

来自MYSQL的php下拉菜单,如何返回其他列值?