2016-05-03 63 views
2

我試圖在登錄和註銷站點時登錄數據庫中的用戶活動。這可以正常工作,但是當他們通過選項卡或瀏覽器關閉頁面時,無法運行註銷查詢,因此根據記錄,用戶永遠不會從該站點註銷。PHP在session destory或garabge集合之前調用一個函數

方法1: 我已經試過onbeforeunload,但這似乎並沒有觸發頁面關閉之前。

方法2: 我會嘗試使用發送到PHP的AJAX存活令牌的方法,但這將需要運行每1分鐘,並可能導致高流量負載。

方法3: 我希望的alterantive將設置​​1分鐘和呼叫通過破壞會話回調添加到註銷查詢。

這將是最好的方法,還是有更好的方法來實現?

有沒有辦法在php銷燬會話或php垃圾收集之前觸發自定義函數(查詢)?

UPDATE

我已經採取了大家的建議和決定嘗試 '方法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

當你談到方法1,你在做客戶端,對吧?
接口是window.onbeforeunload,並且這是一個使用例:

window.onbeforeunload = function(e) { 
    // call server script to log the user activity to database ... 
}; 

事件window.onbeforeunload是頁被卸載(製表/窗/瀏覽器關閉)之前觸發。

0

我想稍微擴展MarcoS的答案。 window.onbeforeunload應該可以工作,但這不是設置事件處理程序的首選方式。由於這是一個屬性,因此附加到此事件的其他腳本將覆蓋您的偵聽器,並且您的函數將永遠不會被調用。

註冊到本次活動的首選方法如下:

window.addEventListener('beforeunload', function (evt) { 

}, false); 

你也可以附加一個事件監聽器unload

window.addEventListener('unload', function (evt) { 

}, false); 

希望這有助於

+0

Orginally我有一個jQuery改變,並沒有工作。我嘗試了你的第一個例子,並在裏面添加了一個警告,但即時獲得相同的結果(頁面關閉,沒有警報彈出)。這個警報應該在頁面關閉之前通過瀏覽器標籤彈出是嗎? – Orbitall

+0

據我所知,當頁面卸載時不​​可能調用alert()。但是可以通過在代碼中設置「event.returnValue」來顯示一個警告框。我創建了一個[jsfiddle](https://jsfiddle.net/u6kzwmov/1/)。爲你展示這一點。 –

+0

是啊,我已經嘗試了很多次,檢測頁面被關閉使用這個卸載和之前卸載(這是非常hacky),結果與ajax調用does not allways工作。我需要向用戶關閉瀏覽器的服務器發送消息。任何建議如何做到這一點? – Orbitall

相關問題