PHP在会话destory或garabge集合之前调用函数

时间:2016-05-03 12:50:35

标签: php jquery ajax session

我尝试在登录和注销网站时记录数据库中的用户活动。这样可以正常工作,但是当他们通过选项卡或浏览器关闭页面时,无法运行注销查询,因此根据记录,用户永远不会退出站点。

方法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;
        }
    });

任何人都可以建议如何改善这项工作吗?

2 个答案:

答案 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);

希望这有帮助