網頁

2013年12月11日

[php] 使用session計算網站在線人數

使用讀寫Log檔或資料庫,都可以做到顯示網站線上人數,差異在於資源系統消耗的多寡,而本次要介紹的方式,是通過計算主機上的session檔案數量,用來代表線上人數。

網頁只要有使用到session相關的函數,主機就會隨著用戶連線到網頁時,在主機上建立一個名稱不重覆的session記錄檔,而session記錄檔在用戶重新整理(刷新)時,就會更新session記錄檔的異動時間,當用戶離開網頁後,記錄檔會自動消失或不再更新異動時間,因此只要運用這些規則,就可以順利透過計算session檔案數量的方式,直接計算出線上人數。

採用寫Log檔或資料庫,都會有處理Log資料的步驟,而且還要時時注意記錄檔的大小,因為處理愈多的資料,主機耗用的資源愈多,反之,若使用session記錄檔來計算線上人數,因為只是讀取檔案的索引,並未實際讀取檔案的內容,對於主機的I/O負載較低,計算速度相對較快,說它是低消耗高效能的方式也不為過。

前面盡是提到使用session計算在線人數的優點,現在就來談談缺點,這個方式最大的缺點就是準確性不夠,為何說準確性不夠,因為session記錄檔,必須用戶有瀏覽網頁,記錄檔的異動時間才會更新,而當用戶只開著網頁,長時間都沒有任何操作時,就會被判定為離線,但實際上用戶只是開著網頁發呆而已,不過這缺點運用Javascript的setTimeout函數,做停留逾時刷新session就可解決。

既然有準確性的缺點,為何還要執意採用這方式,這就關係到處理的次數及主從式架構問題,先來說處理的次數,所謂的處理次數是指,若採用Log檔(資料庫)的方式,必須每次都要做計算處理,即使線上人數沒變,系統還是要重從頭到尾計算處理一次,而採用session記錄檔的方式,只有在用戶逾時停留的時候才處理,用戶若持續瀏覽網頁,就不會觸發停留逾時刷新session的條件,而主從式架構指的是,處理的對象不同,一個是集中伺服主機在處理,另外一個則是用戶端瀏覽器在處理,相較之下,部份程序讓給用戶端處理,可以降低主機負擔。

程式範例:
網站若已經有使用session函數,前面三行session函數可以去除。
session_start();
session_register("online");
session_commit();


//session記錄檔異動時間在300秒以內,都計算為在線人數
echo onLine(300);

function onLine($second)
{
 $qty = 0;
 //讀取sess_開頭的檔案,如有自定session檔前綴字元的,請自行變更
 foreach (glob(session_save_path()."/sess_*") as $sess_file){
  //session異動時間在300秒以內的,就納入在線人數
  if (filemtime($sess_file)+$second >= time()){
   ++$qty;
  }
 }
 return $qty;
}