代碼很簡單,但實現邏輯自己要想明白,

創(chuàng)新互聯建站成立于2013年,是專業(yè)互聯網技術服務公司,擁有項目成都網站建設、做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元修水做網站,已為上家服務,為修水各地企業(yè)和個人服務,聯系電話:13518219792
網站頭公共文件加下邊代碼,意思即每個頁面都有包含下面這個php代碼,總之你懂,
這樣,只要有用戶登陸,或者打開別的頁面,就會往?all_user?表里?的action_time字段添
加操作時間,?當你檢測用戶是否在線,就把用戶操作時間action_time轉化為?幾分鐘前,小時前,
,知道每個用戶是?幾分幾小時前操作,就可以把幾分鐘前的顯示在線,而幾小時前的,顯示離線或幾小時前,
例如用戶15:30分登陸,打開幾個頁面,然后就關電腦或出門,?這時all_user?表已經記錄了操作時間
網站可以用?wordTime($time)顯示他的操作時間離現在為2分鐘前,或20分鐘前,將直接顯示在線。
至于多少分鐘不操作算離線,自己調分鐘數
?php
strtotime("now");?//取服務器當前時間戳,得到值如1533213376
$sql="UPDATE?all_user?SET?action_time=$action_time?WHERE?userid=$cook_userid";
//往用戶表里更新?操作時間,具體要填自己的表名和用戶名的?字段名
?
//======================下邊功能代碼可copy?直接用
?php??
function?wordTime($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";??echo?wordTime($time);??結果將輸出?20分鐘前????
?
不存在頻繁操作數據庫問題,因為打開網頁都要查詢mysql 用戶名等這些,也不差這條更新命令,
參考下我的登錄處理
//定義處理后臺登陸提交數據
public function login(){
if (!IS_POST) halt('頁面不存在');
$username=I("username");
$pwd=I("password",'','md5');
//p($pwd);die;
//1.檢查數據庫中這個用戶是否存在
$user=M('user')-where(array('username' = "$username"))-find();
//如果數據庫中的用戶不存在,或者存在但是密碼不正確就報錯。
if(!$user || $user['password']!=$pwd){
$this-error("用戶名或密碼錯誤!");
}
//如果上面條件都成立的話,每次登陸后更新下面數據
$data=array(
'id' = $user['id'],
'sign'=$user['sign'],
'shenfz'=$user['shenfz'],
'tel'=$user['tel'],
'weixin'=$user['weixin'],
'qq'=$user['qq'],
'logintime' = time(),
'loginip' = get_client_ip()
);
//更新數據庫數據
M('user')-where(array('id' =$user['id']))-save($data);
if(in_array($user['zw'],array(1,2,3))){
$role=M('role_user')-where(array('user_id' = $user['id']))-getField('role_id',true);
}else{
$role=M('role_user')-where(array('user_id' = $user['id']))-getField('role_id');
}
//存取登陸session數據
session(C('USER_AUTH_KEY'),$user['id']);
session(username,$user['username']);
session(role,$role);
session(bm,$user['bm']);
session(tel,$user['tel']);
session(email,$user['email']);
session(zw,$user['zw']);
session(logintime,$date['logintime']);
session(loginip,$user['loginip']);
//存取session數據后跳轉到后臺用戶列表頁
if($user['username'] == C('RBAC_SUPERADMIN')){
session(C('ADMIN_AUTH_KEY'), true);
}
import('ORG.Util.RBAC');
RBAC::saveAccessList();
//插入用戶操作日志
$content=$_SESSION['username'].date("Y-m-d H:i:s",time())."登入了日志任務系統";
$logs=array(
'userid' =$_SESSION[C('USER_AUTH_KEY')],
'operate' =time(),
'content' =$content,
'status' =0
);
//存取登錄操作log信息
M('userlog')-add($logs);
//調整后臺首頁
$this-redirect('Admin/Index/index');
}
樓上說的還是要定時檢測
不論怎么做,繞來繞去都是一樣的,都是需要定時檢測。
Ajax 控制一個異步PHP程序來檢測數據庫,然后返回值,供調用。
大概邏輯是這樣的,如果要達到一個賬號登陸了,要把另一個客戶端上的統一賬號踢掉,那么你需要用記錄用戶頭token,和設備唯一識別號到數據庫。
當用戶登陸的時候,檢測和用戶uid相關的token表,如果已經有token了,并且本次的設備唯一識別號和已經登陸的識別號不一樣,那么清空原有token,也就是將原來登陸的賬號踢下線。記錄新的設備識別號的token即可。
php大致代碼如下:
$currentDeviceUUID=getDeviceUUID();
$uid?=?getUserId();
$token?=?generateToken();
select?*?from?tokenTable?where?uid="$uid";
update?set?token=''??where?uid="$uid";
insert?into?tokenTable?(uid,?token,?deviceUUID)?values("$uid",?"$token",?$currentDeviceUUID);
原理:根據不同的IP統計出當前有多少人在線。
實現方式:可以用數據庫,也可以用文本。
我這里用了文本實現。
$user_online = "count.php"; // 保存人數的文件
touch ( $user_online ); // 如果沒有此文件,則創(chuàng)建
$timeout = 30; // 30秒內沒動作者,認為掉線
$user_arr = file_get_contents ( $user_online );
$user_arr = explode ( '#', rtrim ( $user_arr, '#' ) );
print_r ( $user_arr );
$temp = array ();
foreach ( $user_arr as $value ) {
$user = explode ( ",", trim ( $value ) );
if (($user [0] != getenv ( 'REMOTE_ADDR' )) ($user [1] time ())) { // 如果不是本用戶IP并時間沒有超時則放入到數組中
array_push ( $temp, $user [0] . "," . $user [1] );
}
}
array_push ( $temp, getenv ( 'REMOTE_ADDR' ) . "," . (time () + ($timeout)) . '#' ); // 保存本用戶的信息
$user_arr = implode ( "#", $temp );
// 寫入文件
$fp = fopen ( $user_online, "w" );
flock ( $fp, LOCK_EX ); // flock() 不能在NFS以及其他的一些網絡文件系統中正常工作
fputs ( $fp, $user_arr );
flock ( $fp, LOCK_UN );
fclose ( $fp );
echo "當前有" . count ( $temp ) . "人在線";
本文名稱:包含php數據庫多用戶監(jiān)測的詞條
網址分享:http://chinadenli.net/article13/dsieids.html
成都網站建設公司_創(chuàng)新互聯,為您提供域名注冊、品牌網站設計、自適應網站、外貿建站、虛擬主機、網站策劃
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯