我試圖在登錄和註銷站點時登錄數據庫中的用戶活動。這可以正常工作,但是當他們通過選項卡或瀏覽器關閉頁面時,無法運行註銷查詢,因此根據記錄,用戶永遠不會從該站點註銷。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;
}
});
任何人都可以提出任何改進措施,我怎樣才能使這項工作做得很好?
Orginally我有一個jQuery改變,並沒有工作。我嘗試了你的第一個例子,並在裏面添加了一個警告,但即時獲得相同的結果(頁面關閉,沒有警報彈出)。這個警報應該在頁面關閉之前通過瀏覽器標籤彈出是嗎? – Orbitall
據我所知,當頁面卸載時不可能調用alert()。但是可以通過在代碼中設置「event.returnValue」來顯示一個警告框。我創建了一個[jsfiddle](https://jsfiddle.net/u6kzwmov/1/)。爲你展示這一點。 –
是啊,我已經嘗試了很多次,檢測頁面被關閉使用這個卸載和之前卸載(這是非常hacky),結果與ajax調用does not allways工作。我需要向用戶關閉瀏覽器的服務器發送消息。任何建議如何做到這一點? – Orbitall