2

我正在修改一个基于成员的网站,其所有者希望能够跟踪数据库后端中所有用户在网站上花费的时间(登录/注销)。登录很容易;有一个入口点(登录表单),因此,一旦登录就可以在数据库中抛出。

但是,注销有点棘手,因为除非用户单击“注销”以明确让我们知道他们要离开解决方案,否则会变得更麻烦(以及用户真正单击注销的频率如何?)。一种可能性(仅就跟踪网站上的总时间而言)是在数据库中注册每个页面加载并将其与加载它的用户相关联;问题在于该站点是一个基于会员的视频交付站点(不是您想的那样!),他们的最后一次浏览量可能是 20 或 30 分钟的视频。我们还需要捕获在最后一页上花费的时间——而不仅仅是加载它的时间。

我想到了两种可能的解决方案,但都不是那么优雅。第一个是通过 javascript 捕获所有“卸载”事件并注册对“logout.php”的调用(假设 XMLHttpRequest 或任何在页面卸载后不会立即消失的东西);问题在于内部链接也注册为卸载事件,因此单击任何链接都会将用户注销(您可以检查“卸载”处理程序中的标志,并让所有内部链接设置该标志 - 不难做到动态的,但有点笨拙)。另一种方法是设置一个间隔,每 60 秒左右对数据库执行一次 ping 操作,这让我们知道用户仍在网站上,然后在提取用户历史记录时进行一些数学运算以计算出该会话的总长度; 这似乎也有点骇人听闻。还,

似乎这个问题并没有那么不寻常,而且必须有更好的方法;是否有解决此问题的最佳实践方法?如果没有,您是否看到任何改进这些解决方案的方法?

4

2 回答 2

3

网络不是为了准确跟踪注销事件而构建的。您只是不能保证在用户退出时从浏览器中得到通知,因此在正常情况下,您最好的希望是捕获会话超时事件,并且该事件可能要到用户放弃页面后 20 分钟才会触发.

现在您可以通过在每个页面上的计时器(可能每分钟一次或两次)中放置一个 ajax 请求来稍微改进这一点,以提供“心跳”,但这也有一些警告:您需要确保会话将最终仍然会超时,并且您仍然不能保证用户不会阻止这些请求,可能是通过禁用 javascript。

于 2008-12-02T14:40:04.037 回答
0

我在 javascript 中使用计时器来 ping 服务器取得了很好的成功。在我的情况下,该网站需要 javascript,所以这不是问题。我还使用这种机制来执行检查,以防止单个帐户从两台不同的机器登录,因此有更多令人信服的理由进行此 hack。

卸载时要记住的一件事是您仍然不能保证卸载事件将始终被触发。例如,您将有人在笔记本电脑上关闭笔记本电脑,因此计时器方法可能会更准确一些。

于 2008-12-02T14:38:31.137 回答