如何添加顯示哪些用戶在線直到他們離開頁面或註銷的區域?添加'在線用戶'區域
我想過製作一個表格,讓用戶會話保持到他們離開頁面,但是我怎麼能夠告訴他們什麼時候離開?我只需要每5秒更新一次。我想遠離cron作業距離酒店僅在windows的情況下,(Windows不支持cron的不是嗎?)
感謝所有幫助
如何添加顯示哪些用戶在線直到他們離開頁面或註銷的區域?添加'在線用戶'區域
我想過製作一個表格,讓用戶會話保持到他們離開頁面,但是我怎麼能夠告訴他們什麼時候離開?我只需要每5秒更新一次。我想遠離cron作業距離酒店僅在windows的情況下,(Windows不支持cron的不是嗎?)
感謝所有幫助
我在我們的應用程序之一,前一段時間做了類似的事情。將Ajax調用綁定到某個事件,如click或mousemove。在那個調用中,將時間戳寫入active_users表。寫另一個函數來查詢這個表,並選擇時間戳比5分鐘更早的用戶。以特定的時間間隔或broeser事件通過Ajax進行調用。
有很多可能的解決方案,如果你想要回代碼,你應該爲你的實現發佈一些代碼。
作爲一個總體設計問題,您可能需要一種方法來存儲有多少用戶在線(更多地檢測下面的內容),無論是在內存中(後端服務,在內存數據庫像redis或memcached)或磁盤(常規D B)。
至於檢測用戶何時在線,這可能是一個相當困難的問題,但假設精確到第二個數字並不重要,您可以增加數字(從上面的數據庫或內存中)當您提供頁面(PHP)或用戶加載頁面時(Javascript)。
至於檢測用戶何時離開,您可以在Javascript中使用onunload
處理程序,以便在用戶導航時通知服務器。需要注意的一個警告是,這條消息可能會丟失或者不會被髮送(即JS關閉,瀏覽器崩潰等),並且您的計數可能變得非常不準確。
或者,客戶端可以ping每[predefined interval]
心跳和服務器的服務器會知道他們是在網上(遞減計數器,當用戶停止發送心跳,假設他們已導航離開)基於這些
高級別的解決方案,他們也可以組合成一個混合解決方案,使用心跳檢測用戶是否仍然在線以及在關閉/導航時立即通知服務器。
最後,就像關於cron作業的說明一樣,Windows本身沒有cron
,但可以使用計劃任務完成類似的目標。
有各種選擇。這是我更喜歡的,但你的里程可能會有所不同。
使用JavaScript來請求用戶在一段時間內輪詢/碰撞您的服務器,並使用此請求來存儲哪些用戶在線。使用jQuery JavaScript部分的一個例子:
var ajaxCall;
var livedataTimer;
function poll(timeout){
livedataTimer = setTimeout(function(){
if (ajaxCall != null){
ajaxCall.abort();
}
if (timeout == 5){
timeout = 10000;
}
ajaxCall = $.ajax({ url: '/ajax/bump.php', type: 'POST', success: function(data){
poll(timeout);
}, dataType: "json"});
}, timeout);
return livedataTimer;
}
的/ajax/bump.php
文件的一個示例:
<?php
session_start(); ## to know which user is online
## connect to your DB somewhere
mysqli_query($connection,"
INSERT INTO `online-status`
(`user`, `time`)
VALUES
(".(int)$_SESSION['user']['id'].", UNIX_TIMESTAMP())
");
return TRUE; ## return TRUE so that ajax knows the file has completed
?>
我們獲得在線用戶列表,你可以用一個條件查找您online-status
表中,例如,「時間不超過20秒。「
這是一個很好的做法,INSERT
數據到一個單獨的數據庫,而不是UPDATE
在userlist
數據庫中的時間戳。這些往往是相當緩慢。
我用time();
函數值插入用戶表中的每一次用戶訪問的網頁,並拉出來,並使用此功能,
echo '<h3>Online Users</h3>';
$query = "SELECT * FROM users";
$data = mysqli_query($dbc, $query);
while ($row = mysqli_fetch_array($data)){
if(time() - 10 < $row['active']){
echo '<a href="index.php?action=ucp&uid='.$row['uid'].'">'.$row['username'].'</a>';
}
}
是否有一個數據庫設置,如果它尚未x分鐘內更新,將x分鐘後刪除它們 – Cheesecake 2014-11-22 16:34:52
或者可能你指出我心跳的正確方向理念? – Cheesecake 2014-11-22 17:00:33
參考我的回答,看我是怎麼做的 – Cheesecake 2014-11-22 17:32:12