php用戶在線
A. php如何實現判斷用戶是否在線的功能
其實HTTP協議是無連接的,數據交換完畢就斷開了,理論上伺服器上無論用什麼語言寫的程序,都不可能知道客戶端的用戶是否在線。
一般的辦法都是客戶端打開網頁的時候,記錄一下最後打開時間,我們假釋打開一個頁面會保留多長的時間(比如10秒),那麼只要最好打開網頁的時間到現在沒有超過這個限度的就叫做在線,超過的就是離線。
B. PHP網站中,如何判斷用戶是否是在線的狀態
普通http網站是一種無狀態連接,每次一個請求,一個應答,沒有長連接狀態。
但是可以通過記錄訪問時間,來確定用戶的狀態。
用戶登錄後,每次訪問,更新一下最近訪問時間在資料庫里
在用戶頁面的公共部分,做一個定時輪詢,n秒一次(防止用戶打開頁面後放著不動,看資料或者做別的)
伺服器端做一個定時,將最近時間在n秒內的用戶設為在線狀態,將最近時間大於n秒的(說明已經關了頁面),設為離線狀態。 如果是普通 web空間無法配置定時器,可以在每次用戶訪問時處理一次(如果用戶量大,需要做時間判斷,防止同時訪問量多時多次重復處理,影響伺服器性能)
如果能確定一個用戶的訪問,只有一個瀏覽器窗口,可以在窗口裡加一個關閉事件(onbeforeunload),在此事件中發送一個退出請求,主動設為離線狀態。這樣狀態管理會更完美一些
這樣基本就可以完成一個在線狀態的管理。具體n 設為多少可根據情況而定,一般5-30秒都是合理的,太短了伺服器壓力比較大,太長了誤差會比較大
C. php做用戶在線與離線狀態
在用戶表裡加個session欄位存取時間戳。在文件頭每次刷新就更新它。一定時間不刷新就表示人物離線了。讀取這個會員數據的時候和當前時間戳對比小於一定數就離線了
D. php聊天系統怎麼樣判斷用戶是不是在線
這個其實有很多種處理方案,我給兩個方案吧,
方案一、用戶登陸成功後,將用戶的信息,如用戶ID保存到session當中去,然後我們去判斷session當中是否有當前用戶ID就可以判斷出該用戶是否在線了,然後用戶退出的時候,將此session清除就可以啦;
方案二、
用戶表設置一個欄位,用於保存用戶的登陸狀態,如果用戶登陸成功才設置成1,否則設置成0,然後當要判斷用戶是否登陸的時候,只要到資料庫當中去取這個值判斷就可以啦,用戶退出前,要先將這個狀態Update成0狀態就可以啦,不過這樣的話,當由於斷電而非法關閉的時候,用戶狀態就沒有辦法更新到資料庫當中啦;
兩個方案自認為還是方案一要好些啦;
E. php中如何判斷用戶是否在線
代碼很簡單,但實現邏輯自己要想明白,
網站頭公共文件加下邊代碼,意思即每個頁面都有包含下面這個php代碼,總之你懂,
這樣,只要有用戶登陸,或者打開別的頁面,就會往all_user表裡的action_time欄位添
加操作時間,當你檢測用戶是否在線,就把用戶操作時間action_time轉化為幾分鍾前,小時前,
,知道每個用戶是幾分幾小時前操作,就可以把幾分鍾前的顯示在線,而幾小時前的,顯示離線或幾小時前,
例如用戶15:30分登陸,打開幾個頁面,然後就關電腦或出門,這時all_user表已經記錄了操作時間
網站可以用wordTime($time)顯示他的操作時間離現在為2分鍾前,或20分鍾前,將直接顯示在線。
至於多少分鍾不操作算離線,自己調分鍾數
<?php
strtotime("now");//取伺服器當前時間戳,得到值如1533213376
$sql="UPDATEall_userSETaction_time=$action_timeWHEREuserid=$cook_userid";
//往用戶表裡更新操作時間,具體要填自己的表名和用戶名的欄位名
?>//======================下邊功能代碼可直接用
<?php
functionwordTime($time){
$time=(int)substr($time,0,10);
$int=time()-$time;
$str='';
if($int<=2){
$str=sprintf('在線',$int);
}elseif($int<60){
$str=sprintf('在線',$int);//60秒內
}elseif($int<300){
$str=sprintf('在線5',$int);//5分鍾內
}elseif($int<1800){
$str=sprintf('在線+',floor($int/60));//30分鍾內
}elseif($int<3600){
$str=sprintf('%d分鍾前',floor($int/60));//30-60分鍾內
}elseif($int<86400){
$str=sprintf('%d小時前',floor($int/3600));
}elseif($int<2592000){
$str=sprintf('%d天前',floor($int/86400));
}elseif($int<2592000*30){
$str=sprintf('%d月前',floor($int/2592000));
}else{
$str="";//date('Y-m-d',$time);
}
//調用方法,把值給到變數time如:$time="1533213376";echowordTime($time);結果將輸出20分鍾前
?>
不存在頻繁操作資料庫問題,因為打開網頁都要查詢mysql 用戶名等這些,也不差這條更新命令,