PHP观察者模式:当会话超时时记录用户退出

6
我试图在用户会话超时时注销用户。在我的情况下,注销用户需要修改数据库中用户的“在线”状态。 我想我可以使用观察者模式来监视用户会话的状态,并在会话过期时触发回调 - 这将保留用户的名称,以便我们可以更新数据库。我不确定从哪里开始处理会话问题。我能否将回调与会话的超时绑定?
这些功能是否内置在任何可用的pear或zend会话包中?我会使用任何必要的工具来实现这一点!
更新@ 16:33: 如果您有一个用户可以相互交互的系统(但他们只能与在线用户进行交互)?用户需要知道当前在线的其他用户。
如果我们仅检查每个页面刷新时会话是否仍然存在,则超时后,用户将被发送到未登录的页面,但他们仍将在系统中列为在线。
那种方法还好,除非我们超时会话,否则我们将失去关于用户的信息,这些信息可以用于注销用户。
更新@16:56: 对的。谢谢。我同意...有点丑陋。我已经在服务器上进行了一些缓慢的轮询,因此很容易实现该方法。它似乎是一个会话处理包的有用功能。Zend和PEAR都有会话包。
6个回答

2

每当用户访问一个页面时,将该时间记录在数据库中,并将此列称为LastAccessed。当用户单击站点的注销部分时,您可以将此值设置为null。编写查询以查找当前已登录用户列表时,请执行以下操作:

SELECT *  FROM Users WHERE LoggedIn=1 AND LastAccess > DATEADD(Minute,-20.GETDATE())

这将返回仍有活动会话的用户。抱歉,SQL可能不适用于MySQL/PHP,但这应该能给您一个大致的想法。


2
先从最简单的情况说起。假设您的系统上有1个用户,并且希望他们的会话在超时时得到准确报告。如果用户在12分钟内没有访问页面,而您的会话超时设置为10分钟,则会发生以下两种情况之一:他们会很快再次访问,或者不会。如果他们不再访问,系统如何运行代码以更新其超时状态呢?唯一的方法*是让一个独立的进程来启动一个状态更新函数,为所有当前处于“会话中”状态的用户进行状态更新。

每当一个用户访问您的网站时,在数据库中更新一个与其会话相关的变量,以记录上次访问时间。然后创建一个每分钟运行一次的cron作业。它调用一个简单函数来检查会话状态。任何超过超时周期的会话都将被设置为“已超时”状态。(过了一段时间后,您还应该清理表格中的已超时会话)。如果您想要报告登录人数,请查询所有最后访问时间晚于超时间隔开始的记录。

"*" 还有其他方法,但对于一个简单的Web应用程序来说,这并不是必需的。如果您拥有比简单Web应用程序更复杂的内容,请更新您的问题以反映特定需求。


不要使用cron,而是在页面逻辑中进行简单的用户检查(查找cookie,在用户数据库记录上检查“last_visited”列等)。因此,如果用户决定重新活跃起来,您可以验证用户信息和活动,并且仍然能够重定向,因为头部尚未发送。 - William Holroyd

1

你为什么想要这样做呢?通常的方法是在用户发送每个请求时检查超时是否已过期。当然,这意味着你的数据库中的状态不是最新的,因为即使超时已到达,用户仍被显示为已登录。

但在实际操作中,这通常并不重要。


0

我知道这可能是一个老问题,但是你问题的“最佳”答案在这里找到了: http://www.codeguru.com/forum/archive/index.php/t-372050.html

以下是它的意思: php.ini文件包含一个名为session.save_path的设置,它确定PHP放置包含会话数据的文件的位置。一旦会话变得过时,PHP将在下一次垃圾回收期间删除它。因此,对该会话的文件存在性进行测试应足以确定该会话是否仍然有效。

$session_id = 'session_id';
$save_path = ini_get('session.save_path');

if (! $save_path) {
$save_path = '.'; // if this vlaue is blank, it defaults to the current directory
}

if (file_exists($save_path . '/sess_' $session_id)) {
unlink($session_id); // or whatever your file is called
}

你的逻辑有问题。!file_exists()?? - Rotimi

0

丑陋但可能可行的建议:

在页面上添加一个异步保持活动状态的请求器,更新它们的最后活动时间戳。然后您可以有一个定时任务,如果用户的最后活动时间戳超过20秒,则将其标记为离线。将该定时任务设置为每分钟运行即可。我不确定是否有一种方法可以在用户会话超时或关闭浏览器时触发某些操作。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接