php取得線上人數

來源:互聯網
上載者:User
在論壇裡有人問我如何統計線上人數?我也不知道什麼是最好的方法。下面是本站的實現的原理,我把它寫出來,供大家參考。這隻是我的方法,肯定不是最好的,還希望高手們予以指正。

其實,要真正統計同時在並發線上的人數,是一件不太現實的事,這是因為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, hunte@phpuser.com

修改: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的管理、網站的訪問統計分析等。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.