我尝试在登录和注销网站时记录数据库中的用户活动。这样可以正常工作,但是当他们通过选项卡或浏览器关闭页面时,无法运行注销查询,因此根据记录,用户永远不会退出站点。
方法1:
我尝试了onbeforeunload
,但在页面关闭之前似乎没有触发。
方法2: 我会尝试使用发送到php的ajax keepalive令牌的方法,但是这需要每1分钟运行一次并且可能导致高流量负载。
方法3:
我希望改变是将session.gc.maxlifetime
设置为1分钟并通过销毁会话回调添加对注销查询的调用。
哪种方法最好,还是有更好的方法来实现这一目标?
有没有办法在php destroy session或php垃圾收集发生之前触发自定义函数(查询)?
更新
我接受了所有人的建议并决定尝试“方法1”。到目前为止,这是我的尝试,但它仍然没有完美地运作:
var isClosePage = true;
//detect f5 and backspace page navigation
$(document).on('keypress', function(e)
{
if (e.keyCode == 116)
{
alert('f5');
isClosePage = false;
}
if (e.keyCode == 8)
{
alert('backspace');
isClosePage = false;
}
});
//detect back and forward buttons
$(window).bind('statechange',function()
{
alert('back');
isClosePage = false;
});
//detect page button press
$('html').on('mouseenter', function()
{
console.log('mouse has enetered!');
isClosePage = false;
});
//detect browser buttons press
$('html').on('mouseleave', function()
{
console.log('mouse has left!');
isClosePage = true;
});
//make ajax call (logout) to server if above events not triggered
$(window).on('beforeunload', function(e)
{
if(isClosePage)
{
$.ajax(
{
url:'php/function/active-user.php?logout=ajax',
dataType: 'jsonp',
crossDomain: true,
async: false
});
//return 'some default message';
}
else
{
isClosePage = true;
}
});
任何人都可以建议如何改善这项工作吗?
答案 0 :(得分:0)
当你谈到方法1 时,你正在做客户端,对吧?
界面为window.onbeforeunload
,这是一个用法示例:
window.onbeforeunload = function(e) {
// call server script to log the user activity to database ...
};
在卸载页面之前触发事件window.onbeforeunload
(标签/窗口/浏览器已关闭)。
答案 1 :(得分:0)
我想稍微扩展MarcoS的答案。 window.onbeforeunload
应该可以工作,但这不是为事件设置处理程序的首选方法。由于这是一个属性,因此附加到此事件的其他脚本将覆盖您的侦听器,并且永远不会调用您的函数。
注册此活动的首选方式如下:
window.addEventListener('beforeunload', function (evt) {
}, false);
您还可以将事件监听器附加到unload
window.addEventListener('unload', function (evt) {
}, false);
希望这有帮助