Php 基于用户活动更新数据库表

Php 基于用户活动更新数据库表,php,javascript,mysql,Php,Javascript,Mysql,我有网站所有用户的日志表 成功登录后,我正在记录有关用户righ的各种数据 如果未填写signout\u dt字段,并且对于某些用户id,status为1,则网站会自动阻止登录 对于那些有饼干的人来说,没有问题 问题是,假设用户在没有cookie的情况下登录:只有会话变量。我不知道,我怎样才能更新数据库表和注销用户,比如说在30分钟不活动之后。请注意,我无法在服务器端创建cron作业或其他内容,因为使用共享主机 听说了,可以创建一些类似heartbeat的脚本,持续发送一些关于用户活动的数据。

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

成功登录后,我正在记录有关用户righ的各种数据

如果未填写
signout\u dt
字段,并且对于某些
用户id
status
为1,则网站会自动阻止登录

对于那些有饼干的人来说,没有问题

问题是,假设用户在没有cookie的情况下登录:只有会话变量。我不知道,我怎样才能更新数据库表和注销用户,比如说在30分钟不活动之后。请注意,我无法在服务器端创建cron作业或其他内容,因为使用共享主机

听说了,可以创建一些类似heartbeat的脚本,持续发送一些关于用户活动的数据。但我认为这将给服务器带来沉重的负载,特别是当用户超过1000人时。。有什么建议、教程、文章或其他东西吗

使现代化 Deceze试图解释,但我真的需要更好的解释(更好的想法)和代码。

要“暂停”用户,只需记下他最后一次出现的时间。然后,<强>必要时,检查您上次看到用户的时间是否超过X分钟/小时/天,并考虑最后一个会话超时。您不需要运行cron作业或任何在用户之后实时清理的操作,您只需要能够确定在需要某些信息时是否应将其视为过时信息

您可能希望偶尔运行cron作业或其他东西来清除旧的、不必要的数据,但这不需要实时进行。您甚至可以将其作为常规页面请求的一部分运行:

if (mt_rand(1, 1000) == 1) {
    mysql_query('DELETE FROM `table` WHERE `last_seen` < some point in time');
}
为了避免这些查询对数据库造成冲击,您也可以经常这样做。在用户会话中保留“last_seen\u last_updated”时间戳,然后在每个页面上检查是否要更新数据库:

if ($_SESSION['last_seen_last_updated'] < strtotime('-5 minutes')) {
    mysql_query(...);
    $_SESSION['last_seen_last_updated'] = time();
}
if($\u会话['last\u seen\u last\u updated']
这会给你5分钟的抖动,但这通常是完全可以接受的。

要“超时”用户,只需记下他最后一次出现的时间。然后,<强>必要时,检查您上次看到用户的时间是否超过X分钟/小时/天,并考虑最后一个会话超时。您不需要运行cron作业或任何在用户之后实时清理的操作,您只需要能够确定在需要某些信息时是否应将其视为过时信息

您可能希望偶尔运行cron作业或其他东西来清除旧的、不必要的数据,但这不需要实时进行。您甚至可以将其作为常规页面请求的一部分运行:

if (mt_rand(1, 1000) == 1) {
    mysql_query('DELETE FROM `table` WHERE `last_seen` < some point in time');
}
为了避免这些查询对数据库造成冲击,您也可以经常这样做。在用户会话中保留“last_seen\u last_updated”时间戳,然后在每个页面上检查是否要更新数据库:

if ($_SESSION['last_seen_last_updated'] < strtotime('-5 minutes')) {
    mysql_query(...);
    $_SESSION['last_seen_last_updated'] = time();
}
if($\u会话['last\u seen\u last\u updated']

这会给你5分钟的抖动,但这通常是完全可以接受的。

你对会话的管理被破坏了,并且不符合公认的无状态行为——就像你显然需要用户注销一样,这在web应用程序中很少发生——大多数人只是关闭浏览器,而cookies将在用户下一次访问网站时浮动并出现。如果系统希望用户再次登录,那么web服务器必须验证会话——例如,使用时间戳和/或cookie签名等,并使cookie无效,以强制用户在需要时重新登录

因此,您应该以相同的方式对待cookie和会话变量——即;让服务器端生成唯一的签名值。在cookie/session变量中保留过期时间(例如
now()+20min
),或在数据库中保留过期时间

在每次访问时,检查cookie/session变量是否正确签名,并检查其是否超过过期时间,并更新过期时间以允许再等待20分钟

如果访问超过过期时间,即用户空闲时间过长,则清除cookie/session变量并强制用户再次登录


如果您将过期时间保留在数据库中,您只需编写一个小程序,每天或每小时运行一次所有记录,并删除您认为太旧的记录。

您的会话管理已中断,并且不符合公认的无状态行为-就像您显然需要用户注销一样,这种情况在web应用程序中很少出现——大多数人只是关闭浏览器,cookie会在用户下次访问网站时四处浮动并出现。如果系统希望用户再次登录,那么web服务器必须验证会话——例如,使用时间戳和/或cookie签名等,并使cookie无效,以强制用户在需要时重新登录

因此,您应该以相同的方式对待cookie和会话变量——即;让服务器端生成唯一的签名值。在cookie/session变量中保留过期时间(例如
now()+20min
),或在数据库中保留过期时间

在每次访问时,检查cookie/session变量是否正确签名,并检查其是否超过过期时间,并更新过期时间以允许再等待20分钟

如果访问超过过期时间,即用户空闲时间过长,则清除cookie/session变量并强制用户再次登录

如果将过期时间保存在数据库中,只需编写一个小程序,每天或每小时运行一次所有记录,并删除您认为不可用的记录