unload
事件會在窗口關閉時觸發,也可能在用戶刷新頁面或導航到新頁面(即使新頁面位於您的站點內)時觸發。在這種情況下,我建議不要使用unload
。 (unload
更適用於諸如提示用戶在離開表單之前保存或丟失更改等內容)。
另外,如果您實現了javascript解決方案,您要麼(1)要求javascript使用該站點並向禁用JS的人員顯示<noscript></noscript>
元素)或(2)代碼,以便您不僅僅依靠窗口關閉/清理檢測例程釋放資源。
我通常採用的策略是執行ping操作。基本上:客戶端向服務器發送常規Ping,當接收到ping時,該服務器將連接/會話的idle
計數器重置爲0
。根據需要,乒乓每分鐘左右發生一次。長時間運行的循環線程(如果您願意的話,將管理一個Session
管理員)然後檢查任何空閒時間超過idle threshhold
(例如3分鐘,但由您決定)的客戶端,如果超出則釋放與該連接/會話關聯的資源。然後,您網站中的每個頁面(在適當的位置)都會添加此ping代碼,以便客戶端在瀏覽器中打開該頁面時開始ping。
優勢
- 跟蹤用戶多久正在觀看您的站點(度量有用的,尤其是當它的度量耦合用於跟蹤請求的數目)
- 關閉所有連接相關的資源時瀏覽器關閉,並且當用戶離開您的網站時
- 如果用戶導航到您網站上的不同頁面[有ping代碼],他們的連接資源將不會被清除,因爲
idle
計數器將在下一頁
缺點
- 需要JavaScript(
setTimeout
或setInterval
和XMLHttpRequest
,例如)
- ,除非你也有類似的服務器上的 「認證超時」,客戶端可能會繼續您的服務器(和資源)長時間連接,如果用戶離開打開的Web瀏覽器一段時間(您可以通過使用備用ping觸發器來解決此問題,例如鼠標移動,設置焦點以形成字段,單擊,滾動ng等)
客戶端頁面粗糙的示例代碼:
function pingServer() {
var req;
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else {
req = new ActiveXObject("Microsoft.XMLHTTP");
}
req.onreadystatechange = function() {
if (req.readyState == 4 && req.status == 200) {
alert("Idle timer reset on server");
}
}
var url = 'ping.php'; // call php code that will reset idle timer for this client
req.open("GET", url, true);
req.send();
}
var pingFrequencyMs = 5 * 1000; // ping every 5 secs
setInterval(pingServer, pingFrequencyMs);
<noscript>Sorry, JavaScript is required for this website.</noscript>
這裏是過程,你可以在服務器端使用的一個非常粗略的例子,但直到你提供更多的細節我只能推測你正在使用什麼樣的網絡應用程序:
服務器Ping例程(僞代碼,可能是PHP,ASP, JSP等)
- 獲取客戶端連接
unique ID
(或會話ID,或其他)
- 得到客戶
idle
定時器當前值,否則默認爲0
(可從內存緩存,數據庫,文件得到這個在磁盤上;你的選擇)爲max idle
(超時)
- 比較客戶端
idle
- 獲取系統值,以
max idle
- 如果客戶
idle
超過max idle
然後結束會話(這意味着什麼;緊密連接/會話特定的資源,等等 - - 在你的情況下,這意味着調用cleanup
例程,但確保它具有正確的對象上下文),否則重置idle
至0