我想创建一个页面,我可以在该页面上查看登录我网站的用户。对于登录后的每个用户,我都会创建一个会话,并发送一个查询以将 mysql 中的“Logged”行从 No 更改为 Yes。然后,在页面上,我使用 PHP 向大家展示,谁在 mysql 中设置了 Yes,它可以工作。但是,我有一个问题,当有人在没有单击注销的情况下关闭浏览器时会发生这种情况 - 查询不执行并且 mysql 中的 Yes 值保持不变......我该怎么做才能创建这样的页面?
3 回答
代替登录或注销的布尔值,确定会话到期的合理时间量(例如,1 个月),然后将该时间量添加到时间戳并将其存储在数据库中session_expires
。然后,您可以在进行登录检查时检查用户的会话是否已过期。
此外,要手动使会话过期(例如,如果用户注销),只需将该session_expires
字段设置为过去的时间戳。
编辑
周末我无法使用电脑,所以我无法正确更新我的答案。
如果您需要查看活跃用户,我过去做过的一件事是使用last_seen
时间戳字段,该字段会在用户在网站上执行任何操作时更新。然后,在您的“用户登录”页面上,只需查询最近的内容,例如“过去 15 分钟内最后一次看到”。
用户保持登录的事实是由于 PHP SESSION TIMEOUT 可能在 PHP 设置 php.ini 中配置的。
查看http://php.net/manual/en/function.session-set-save-handler.php以了解如何设置会话关闭处理程序(一旦会话无效就会调用该处理程序)。调用关闭处理程序时,在数据库中将当前会话的“记录”设置为 false。不过,它可能需要长达 24 分钟(php.ini 中会话超时的默认值 -session.gc_maxlifetime = 1440
分钟)。
将此值 ( session.gc_maxlifetime
) 减少到 2-3 分钟,并在您的每个页面上使用 ajax 函数来保持会话处于活动状态。这肯定会增加服务器的负载,但您肯定会更好地代表当前活跃的用户。您可以在代码中使用php.ini
或通过使用减少值。ini_set(‘session.gc_maxlifetime’,30);
问候
您对此无能为力,只能定义超时。这意味着您在登录后将您的客户行设置为“YES”的初始调用应该在每个请求(或每分钟备用资源)上触发,以更新该客户行中的日期列。如果不再有更新,则将该客户定义为“不再登录”并将列更新为“否”