国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP如何統計在線人數

2024-05-04 23:05:11
字體:
來源:轉載
供稿:網友


在論壇里有人問我如何統計在線人數?我也不知道什么是最好的方法。下面是本站的實現的原理,我把它寫出來,供大家參考。這只是我的方法,肯定不是最好的,還希望高手們予以指正。

其實,要真正統計同時在并發在線的人數,是一件不太現實的事,這是因為http協議是種無狀態的協議。當客戶端向服務器發出一個請求時,服務器會馬上建立一個新的tcp/ip連接,在該會話結束后,如頁面完全載入后,這個連接就關閉了。一般來說,在線人數指的定是在一定時間段內同時訪問站點的人數,而不是基于http協議的并發連接數。

讓我們先來看看一個訪客是如何訪問一個網站的。他在瀏覽器的地址欄里輸入了目標網站的地址,然后在一段時間內持續瀏覽該網站的網頁,最后,關閉瀏覽器或輸入新的網址——瀏覽結束了。對于服務器端來說,訪客到來是可以知道的,訪客在瀏覽頁面也是可以知道的,可是怎么知道什么時候走的呢?由于http協議是無狀態的,所以無法知道。通常的做法是記下訪客最后一次瀏覽站點頁面的時間。如果該訪客在一個特定的時間內沒有新的動作,那么可以認為他走了。

根據上面的這個思路,我覺得最好用數據庫,因為數據庫要比其他方法如文本文件的效率要高。下面的例子是使用mysql的,很容易使用其他類型的數據庫系統。然后,在所有的頁面中調用這個php文件,一方面更新數據,另一方面可以顯示在線的人數。但是,有一個問題--到底在多長時間內訪問的人算是并發的呢?一般來說,是半個小時,也就是1800秒,具體的要根據網站的情況來確定。這個時間越長,統計出的并發在線的人數就越多。本站的是15分鐘,900秒。用訪問者的ip地址表示一個訪問者是個不錯的方法。在撥號上網的情況下,被分配了相同ip地址的兩個用戶在短時間內瀏覽同一個網站的概率是很小的。

首先,用mysql的工具建一個表:

create table ccol(
id integer not null auto_increment, #記錄的id
ip char(15) not null, #訪問者的ip地址
dtstamp datetime not null, #最后訪問時間
uri char(255), #訪問者請求的uri
primary key (id)
);

然后,寫一段php代碼:

<?
/*
文件:ccol.php - concurrent online statistics
目的:統計同時在線瀏覽的人數
作者:hunte, [email protected]
修改:2000-4-25
*/

$duration=1800;
require "db.php";
//包含dbsql,詳情可以參考我的另一篇文章
$ccol=new dbsql;
$ccol->connect();
$ccol->query("delete from ccol where (unix_timestamp(now())-unix_timestamp(dtstamp))>$duration");
//刪除超過半小時的記錄
$ccol->query("select * from ccol where ip='$remote_addr'");
//判斷當前的ip是否在該表中存在
if ($ccol->nf())//有?
{
$ccol->next_record();//下移找到的記錄數組的指針
$id=$ccol->f('id');
$ccol->query("update ccol set dtstamp=now(), uri='$request_uri' where id=$id");
//設置最后訪問時間和訪問頁面
}
else//沒有
{
$ccol->query("insert into ccol values (0, '$remote_addr', now(), '$request_uri')");
}

$ccol->query("select count(*) as ccol from ccol where (unix_timestamp(now())-unix_timestamp(dtstamp))<=$duration");
//找出在半個小時內的記錄,后面的where子句可有可無--超出時間的已經被刪除了
$ccol->next_record()
echo "在線人數:", $ccol->f('ccol');
$ccol->free_result();
?>

怎么用呢?在站點的每個頁面的上面調用這個程序,舉例來說:
--index.php
...
<!--顯示在線人數->
<?require ../stats/ccol.php?>
...

當然,這段代碼還有改進的余地。例如,在每次調用是都要刪除半小時前的記錄,這是沒有必要而且會降低效率。可以一個什么辦法過更長的時間再做,比如6小時。大家自個兒想想吧,我就不說了。

這種方法只要稍做修改,就可以派上別的用處,如session的管理、網站的訪問統計分析等。

--歡迎高手指正!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 罗江县| 安仁县| 隆化县| 怀宁县| 盐山县| 博湖县| 平昌县| 木兰县| 周至县| 茂名市| 互助| 合山市| 龙陵县| 上林县| 山丹县| 罗平县| 永丰县| 民勤县| 邛崃市| 武冈市| 武汉市| 涿州市| 崇义县| 岗巴县| 北宁市| 姚安县| 青河县| 青海省| 佛坪县| 浮山县| 保德县| 奎屯市| 云林县| 大理市| 德兴市| 五指山市| 定州市| 中宁县| 家居| 湄潭县| 凭祥市|