2008-12-02 37 views
2

我正在对基于成员的站点进行修改,其所有者希望能够跟踪数据库后端中所有用户在站点(登录/注销)上花费的时间。登录很简单;有一个入口点(登录表单),因此登录可以在数据库发生时立即引发。如何跟踪基于Web的登录和注销?

然而,注销有点棘手,因为除非用户点击“注销”来明确告诉我们他们正在离开解决方案会变得更加麻烦(以及用户点击注销的真正次数是多少?)。一种可能性(就跟踪站点上的总时间而言)将是在数据库中注册每个页面载入并将其与装载它的用户相关联;问题在于该网站是一个基于会员制的视频传送网站(不是你在想什么!),他们的最后浏览量可能会是一个二十或三十分钟的视频。我们需要捕捉在最后一页上花费的时间,而不仅仅是加载时间。

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

看来这个问题并不是那么不寻常,而且还有更好的方法;有没有解决这个问题的最佳实践方法?如果没有,您是否看到了改进这些解决方案的方法?

回答

3

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

现在你可以通过在每个页面上的定时器(也许每分钟一次或两次)提供一个ajax请求来提供一个“心跳”,但是这也有一些注意事项:你需要使确保会话最终会超时,并且不保证用户不会阻止这些请求,可能是通过禁用javascript。

0

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

有一件事要记住卸载是你仍然不能保证卸载事件总是会被解雇。例如,您只需关闭笔记本电脑就可以使用笔记本电脑,因此计时器方法可能会更精确一些。