【问题标题】:Logging Activities: How to record time using a PHP application?记录活动:如何使用 PHP 应用程序记录时间?
【发布时间】:2011-12-25 19:01:47
【问题描述】:
我正在使用一些现有的 PHP/MySQL 代码。我正在将某些活动记录/跟踪到 MySQL 数据库中。正在记录某些接入点。统计用户登录系统的次数。但是,我还需要记录用户登录的时间,以及用户在网站某个部分的时间。
由于 PHP 是无状态环境,在大多数情况下,记录端点的最佳方式是什么;或者当用户注销时?
注意:我不能强制用户退出,因为浏览器只能关闭。也许我可以设置一个 AJAX 计时器来计算分钟数?如果是这样,我应该将活动和登录时间视为不同的信息表(MySQL)吗?
编辑:我忘了提到我们确实有可用的 jQuery。
【问题讨论】:
标签:
php
mysql
session
logging
tracking
【解决方案1】:
就像你说的,你不能强迫用户退出,你也不能确定他是在看你的页面还是在玩弹球。
一种解决方案是每隔 5 分钟发出一次 AJAX 请求,告诉您的应用程序用户处于活动状态。不幸的是,如果您的用户锁定了屏幕并开始玩弹球游戏,您仍然不知道他在做什么。此外,以这样的间隔执行 AJAX 请求会增加服务器负载,尤其是在多用户环境中。
我认为最好的解决方案是简单地存储用户的start_time(当他登录时),然后在他执行的每个操作时更新end_time,并且会话超时。
举例:
- 我在 5:00 登录。将
start_time 更新为5:00。
- 我在 5:01 浏览到
foo.php。将end_time 更新为5:01。
- 我在 5:03 浏览到
bar.php。将end_time 更新为5:03。
- 我 5:05 去喝杯咖啡。
- 我在 5:15 回来,我的会话已过期,我需要重新登录。
所以,你知道我在你的申请上花了大约 3 分钟,因为我做的最后一个动作是在 5:03 (5:03 - 5:00 = 3)。当然,你无法确切知道是 3 分钟还是 5 分钟。但你可以假设,大多数时候,如果我不对你的应用程序做任何事情(即:执行脚本、调用等),我就没有使用它。
显然,如果您可以捕获诸如 window close 之类的 JavaScript 事件,那就更好了,或者如果我手动退出:您相应地更新 end_time。
【解决方案2】:
您需要捕获两个事件。
- 页面的 onCLose() 事件并将其挂钩到 ajax 回调到您的日志记录系统。
- 注销按钮的 onClick() 事件并将其挂接到保存 ajax 处理程序中。
onClose 事件将允许您在选项卡/浏览器关闭且 onCLick 事件明显时捕获。
现在这将不会捕获浏览器死机、机器断电等的时间,因此会有一些情况下您会有差距,这些情况可以通过您的登录事件处理程序进行纠正,只需将最后一次登录事件标记为注销在下次登录时。但是,这会导致您在跟踪登录时间时出现异常值,您需要在报告中对这些异常值进行统计处理。
【解决方案3】:
您可以使用一个额外的 PHP 脚本来记录最后的活动并通过 ajax 调用它。
您可以使用 javascript 来监控用户是否仍处于活动状态(在过去 5 分钟内移动了鼠标或按下了某个键等)
编辑:几乎忘记了重要的部分:您的 java 脚本必须在 X 秒内发出一个 ajax 请求。
因此,如果在 x+tollerance 秒内没有请求,您可以认为会话已死。