我正在尝试在用户的会话超时发生时将用户注销。记录用户 - 在我的情况下 - 需要在数据库中修改用户的“在线”状态 我当时认为我可以使用观察者模式来制作一些监视用户会话状态的东西,并在会话到期时触发回调 - 这将保留用户的名字,以便我们可以更新数据库。我不确定在会话方面从哪里开始。我可以将回调绑定到会话的超时吗?
这些东西内置于任何可用的pear或zend会话包中吗?我会尽我所能来实现这一目标!
更新@ 16:33:
如果您的系统中用户可以相互交互(但他们只能与在线用户交互),该怎么办?用户需要知道当前哪些其他用户在线。
如果我们只是在每次刷新页面时检查会话是否仍处于活动状态,那么在超时后,用户将被发送到未登录的页面,但它们仍然在系统中列为在线状态。
该方法没有问题,但是当我们超时会话时,我们会丢失有关用户的信息,可以用来将其注销。
更新@ 16:56:
对。谢谢。我同意......有点难看。我已经对服务器发生了一些缓慢的轮询,因此实现该方法非常容易。对于会话处理包来说,这似乎是一个非常有用的功能。 Zend和PEAR都有会话包。
答案 0 :(得分:2)
首先采取最简单的案例。假设您的系统中有1个用户,并且您希望他们的会话超时,并且您希望准确报告其状态。用户未在12分钟内访问过页面,并且会话超时设置为10分钟。将发生两件事之一。他们要么会在短时间内再次访问,要么他们不会。如果他们不再访问,系统将如何运行代码来更新其超时状态? *唯一的方法是让一个单独的进程为当前处于“会话中”状态的所有用户启动状态更新功能。
每次用户访问您的站点时,请更新数据库中与其上次访问时间相关的变量。然后创建一个每分钟运行一次的cron作业。它调用一个简单的函数来检查会话状态。超过超时期限的任何会话都将设置为“超时”状态。 (你应该在超时会议休息一段时间后清理桌面)。如果您想要有关于登录人数的报告,请查询上次访问时间晚于超时间隔开始的所有记录。
“*”还有其他方法,但出于简单的Web应用程序的目的,它并不是必需的。如果您的某些内容比简单的网络应用程序更复杂,请更新您的问题以反映具体需求。
答案 1 :(得分:2)
每当用户点击页面时,在数据库中标记该时间,请将此列称为LastAccessed。当用户单击站点的“注销”部分时,可以将此值设置为null。在编写查询以查找当前登录的用户列表时,请执行以下操作:
SELECT * FROM Users WHERE LoggedIn=1 AND LastAccess > DATEADD(Minute,-20.GETDATE())
哪个会返回仍有活动会话的用户。请原谅SQL,它可能不适用于MySQL / PHP,但这应该给你一个大致的想法。
答案 2 :(得分:1)
你为什么要这样做?常见的方法是检查用户在超时到期时发送的每个请求。当然,这意味着数据库中的状态不是最新的,因为即使已达到超时,用户仍会显示为已登录。
但出于实际目的,这通常无关紧要。
答案 3 :(得分:0)
丑陋但可能可行的建议:
向页面添加异步保持活动请求者,以更新其上次活动的时间戳。然后,如果用户的最后活动时间戳超过20秒,则可以使用cron作业将用户标记为脱机。设置每分钟运行的cron作业就可以了。我不确定当用户的会话超时或关闭浏览器时,有一种方法可以触发某些事情。
答案 4 :(得分:0)
我的第一个想法是你可以创建一个自定义会话处理程序来解释登录为具有活动会话。
有关创建自定义会话处理程序的一些示例,请参阅http://www.daniweb.com/code/snippet43.html并阅读PHP文档http://ca.php.net/manual/en/function.session-set-save-handler.php
答案 5 :(得分:0)
我知道这可能是一个较旧的问题,但您的问题的“最佳”答案可在此处找到: http://www.codeguru.com/forum/archive/index.php/t-372050.html
以下是它的说法: php.ini文件包含一个名为sesison.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
}