兩種方案:1,每上線一個人就向數(shù)據(jù)庫寫入一次數(shù)據(jù),然后定期做回收。2,利用數(shù)據(jù)庫儲存session。目前看來,第二種更簡單實(shí)用
成都做網(wǎng)站、成都網(wǎng)站建設(shè)的開發(fā),更需要了解用戶,從用戶角度來建設(shè)網(wǎng)站,獲得較好的用戶體驗(yàn)。創(chuàng)新互聯(lián)建站多年互聯(lián)網(wǎng)經(jīng)驗(yàn),見的多,溝通容易、能幫助客戶提出的運(yùn)營建議。作為成都一家網(wǎng)絡(luò)公司,打造的就是網(wǎng)站建設(shè)產(chǎn)品直銷的概念。選擇創(chuàng)新互聯(lián)建站,不只是建站,我們把建站作為產(chǎn)品,不斷的更新、完善,讓每位來訪用戶感受到浩方產(chǎn)品的價值服務(wù)。
要使用數(shù)據(jù)庫,建立一個表,比如名字是online,至少有以下列:
name_ip 存放登錄用戶名,未登錄的存放IP,char類型
url 存放每個頁面的地址,char類型
last_time 存放刷新頁面的最后時間,int類型
表的主鍵是:name_ip+url
每個頁面一開始就要刷新這個表,使用的SQL是:
$name_ip='用戶名或者IP';//你能搞定
$url=$_SERVER["PHP_SELF"];
$time=time();
$sql="replace delayed into online (name_ip,url,last_time) values ('$name_ip','$url',$time)";
mysql_query($sql);
獲取某頁面在線人數(shù)的查詢是語句
$limit=time()-10*60;//10分鐘內(nèi)訪問的認(rèn)為在線,10分鐘*60秒/分鐘
$sql="select count(*) from online where url='$url' and last_time=$limit";
$res=mysql_query($sql);
list($online_count)=mysql_fetch_row($res);
mysql_free_result($res);
echo "本頁面在線人數(shù): $online_count";
“用戶退出或者關(guān)閉瀏覽器SESSION消失的時候在線用戶表刪除相對應(yīng)的數(shù)據(jù)”
這里不可行。。服務(wù)器沒辦法獲取這個信息的。都是被動請求的。
要換個思路,要用js或者其它方式定時觸發(fā)刪除。。
一般15分鐘或者30分鐘。。
數(shù)據(jù)庫還要記錄IP,記錄最近一次觸發(fā)時間。
首先是創(chuàng)建MYSQL數(shù)據(jù)庫表。
CREATE TABLE tablename (
field type(max_length) DEFAULT 'default_value' (NOT) NULL
}
可以使用的SQL語句。
CREATE TABLE useronline (
timestamp int(15) DEFAULT '0' NOT NULL,
ip varchar(40) NOT NULL,
file varchar(100) NOT NULL,
PRIMARY KEY (timestamp),
KEY ip (ip),
KEY file (file)
);
下面我們開始使用PHP腳本,首先定義MYSQL的信息。
server = "localhost"; //你的服務(wù)器
db_user = "root"; //你的mysql的用戶名
db_pass = "password"; //你的mysql的密碼
database = "users"; //表的名字
設(shè)置統(tǒng)計的時間(多少秒內(nèi)在線人數(shù))
timeoutseconds = 300;
取當(dāng)前時間。
timestamp = time();
根據(jù)會話數(shù)來統(tǒng)計在線人數(shù).
一般是這樣的,在數(shù)據(jù)庫中記錄每個用戶的會員數(shù)據(jù),并且用戶的每一次動作都update他的最后動作時間.那么統(tǒng)計在線人數(shù)就是統(tǒng)計某段時間內(nèi)有動作的用戶即可.一般5分鐘或者10分鐘.
上面是靠用戶自己的操作來更新在線時間的.你也可以在用戶停留的頁面弄個JS,隔個2分鐘就做個ajax請求,自動更新用戶的最后的在線時間,
ps 如果你不想修改session存到mysql,memcached等里面,則可以根據(jù)session_id()來獲取PHPSESSID來作為身份標(biāo)識,
然后要在程序中寫上隨機(jī)刪除過期很久了的會話.
至于聊天記錄.你肯定是要保存在服務(wù)器端的,至于讀取.可以通過AJAX幾秒來獲取一次數(shù)據(jù)庫里面的內(nèi)容,當(dāng)然,在獲取記錄的時候,你需要記錄你獲取的時間,然后下次獲取的時候只呀這個時間后的,如果有數(shù)據(jù),則追加到當(dāng)前聊天記錄后面,否則保持不變.
原理:根據(jù)不同的IP統(tǒng)計出當(dāng)前有多少人在線。
實(shí)現(xiàn)方式:可以用數(shù)據(jù)庫,也可以用文本。
我這里用了文本實(shí)現(xiàn)。
$user_online?=?"count.php";?//?保存人數(shù)的文件
touch?(?$user_online?);?//?如果沒有此文件,則創(chuàng)建
$timeout?=?30;?//?30秒內(nèi)沒動作者,認(rèn)為掉線
$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并時間沒有超時則放入到數(shù)組中
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以及其他的一些網(wǎng)絡(luò)文件系統(tǒng)中正常工作
fputs?(?$fp,?$user_arr?);
flock?(?$fp,?LOCK_UN?);
fclose?(?$fp?);
echo?"當(dāng)前有"?.?count?(?$temp?)?.?"人在線";