天天看點

PHP統計線上人數

要想實作這個功能,隻有靠SESSION了。

Session基礎知識

要使用session需要PHP4.1以上的版本,而且需要把php.ini中的register_globle=Off設成register_globle=On。另外,session.cookie_path = / 這行不易更改。

PHP中的session預設情況下是使用用戶端的Cookie。當用戶端的Cookie被禁用時,會自動通過Query_String來傳遞。

Php處理會話的函數一共有11個,我們詳細介紹一下将要用到幾個函數。

1、 session_start

函數功能:開始一個會話或者傳回已經存在的會話。

函數原型:boolean session_start(void);

傳回值:布爾值

功能說明:這個函數沒有參數,且傳回值均為true。最好将這個函數置于最先,而且在它之前不能有任何輸出,否則會報警,如:Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2) in /usr/local/apache/htdocs/cga/member/1.php on line 3

2、 session_register

函數功能:登記一個新的變量為會話變量

函數原型:boolean session_register(string name);

傳回值:布爾值。

功能說明:這個函數是在全局變量中增加一個變量到目前的SESSION中,參數name就是想要加入的變量名,成功則傳回邏輯值true。可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式來取值或指派。

3、 session_is_registered

函數功能:檢查變量是否被登記為會話變量。

函數原型:boobean session_is_registered(string name);

功能說明:這個函數可檢查目前的session之中是否已有指定的變量注冊,參數name就是要檢查的變量名。成功則傳回邏輯值true。

4、 session_unregister

函數功能:删除已注冊的變量。

函數原型:boolean session_session_unregister(string name);

功能說明:這個函數在目前的session之中删除全局變量中的變量。參數name就是欲删除的變量名,成功則傳回true.

5、 Session_destroy

函數功能:結束目前的會話,并清空會話中的所有資源。

函數原型:boolean session destroy(void);

功能說明:這個函數結束目前的session,此函數沒有參數,且傳回值均為true

上面介紹函數下文将會用到,但還有一些有關session的函數也介紹一下:

6、 session_encode

函數功能:sesssion資訊編碼

函數原型:string session_encode(void);

傳回值:字元串

功能說明:傳回的字元串中包含全局變量中各變量的名稱與值,形式如:a|s:12:"it is a test";c|s:4:"lala"; a是變量名 s:12代表變量a的值"it is a test的長度是12 變量間用分号”;”分隔。

7、 session_decode

函數功能:sesssion資訊解碼

函數原型:boolean session_decode (string data)

功能說明:這個函數可将session資訊解碼,成功則傳回邏輯值true

8、 session_name

函數功能:存取目前會話名稱

函數原型:boolean session_name(string [name]);

功能說明:這個函數可取得或重新設定目前session的名稱。若無參數name則表示擷取目前session名稱,加上參數則表示将session名稱設為參數name

9、 session_id

函數功能:存取目前會話辨別号

函數原型:boolean session_id(string [id]);

功能說明:這個函數可取得或重新設定目前存放session的辨別号。若無參數id則表示隻擷取目前session的辨別号,加上參數則表示将session的辨別号設成新指定的id

10、 session_unset

函數功能:删除所有已注冊的變量。

函數原型:void session_unset (void)

功能說明:這個函數和Session_destroy不同,它不結束會話。就如同用函數session_unregister逐一登出掉所有的會話變量。

程式設計思路

在社群、論壇中,我們常能看到目前線上的會員,使通路者有賓至如歸之感。但這種程式是怎麼做出來的呢?

建表user,儲存注冊使用者資訊。

字段 類型 備注

userid Int(10) 使用者序列号 auto_increment     關鍵字

username Varchar(50) 使用者匿稱

userpwd Varchar(50) 密碼

email Varchar(50) 電子信箱

oicq Varchar(50) OICQ号

signature mediumtext 簽名

imgurl Varchar(50) 頭像

joindate Varchar(50) 加入時間

建類檔案user.php 定義函數

exist($username)确認新注冊使用者是不是已經存在

nsert($username,$userpwd,$email,$oicq,$imgurl,$signature)插入注冊使用者

update($userid,$username,$userpwd,$email,$oicq,$imgurl,$signature) 更新使用者資料

get_from_condition($con) 傳回滿足查詢條件的記錄集

建表session。當使用者登入時即向此表插入新記錄,離開或逾時後删除記錄,保證表中儲存的是目前線上的使用者。

sessionid Int(10) 序列号 auto_increment     關鍵字

userid Int(10) 使用者序列号取自user表

ipaddress Varchar(50) Ip位址

lastactivity Int(10) 最後活動時間,用它來判斷使用者是否還線上

建類檔案session.php 定義函數

insert($userid,$ipaddress,$lastactivity) 把登入成功的使用者插入到表中

update($userid,$ipaddress,$lastactivity)更新線上使用者最後活動時間

del($con)删除滿足條件的使用者,用它來清除離線使用者

公用檔案global.php

      include "class/config.inc.php"; //把配置檔案包含進來

      $db         =     new db;

      $db-> db_connect( );           //連接配接資料庫

      $user       = new user;          //初始化

      $session = new session;

//啟動會話

      session_start();

//删除session表中已經過期的使用者(即非線上網友)因為此檔案總是被調用進而保證顯示的都是目前線上的使用者

$curtime=time();

$con="lastactivity<$curtime";

$session->del($con);

//正線上的網友需不斷更新session表中的lastactivity時間,并重新設定使用者的COOKIES

if ($HTTP_SESSION_VARS["online"]=="on"){     //此處也可用$_SESSION[“online”]

$userid=$HTTP_SESSION_VARS["userid"];       //取目前線上使用者的userid

$ipaddress=substr($REMOTE_ADDR,0,50);

$lastactivity=time()+3600;                      //更新最後活動時間,如時一個小時之内未調動頁面就認為使用者已離線,進而會被删除。

$session->update($userid,$ipaddress,$lastactivity);

}else{

//如果未登入那直接轉入登入頁面

$firstpage="logon.php";

header ("Location: $firstpage");

exit;

}

登入檔案logon.php

<? include "global.php";       //把global.php檔案包含進來

      if ($hiddenField=="0"){ //測檢表單有未被送出

      $con="username='$username' and userpwd='$userpwd'";

      $result=$user->get_from_condition($con);

      if ($user->counter==1){

         if (!session_is_registered("online")){//檢測是否被登記過

       session_register("online"); //登記一個新的變量為會話變量

      }

        if (!session_is_registered("ccauser")){

      session_register("ccauser");

        if (!session_is_registered("userid")){  

      session_register("userid");

      $ccauser=$username;          //給會話變量指派

      $online="on";                //這個變量在global.php用到以更新最後活動時間lastactivity

      $userid=$user->userid;

      $ipaddress=substr($REMOTE_ADDR,0,50);

      $lastactivity=time()+3600;

      $con=" userid=$userid";

      $session->get_from_condition($con);

      //判斷會話是否存在,有可能你在不同的機器上登兩次。

      if ($session->counter==1){

       $session->update($userid,$ipaddress,$lastactivity); //如存在,更新

$session->insert($userid,$ipaddress,$lastactivity); //如不存在,插入

     //在客戶機設定COOKIES

      SetCookie("ccauser",$username,time()+3600);

      Header("Location:test.php");//然後導向測試頁

?>

<?

if($HTTP_SESSION_VARS["online"]=="") { //判斷是否已登入

//下面是登入的表單

<form name="form1" method="post" action="">

     名稱: <input type="text" name="username">

     密碼: <input type="text" name="userpwd">

       <input type="hidden" name="hiddenField" value="0">

       <input type="submit" name="Submit" value="送出">

       <input type="reset" name="Submit2" value="重置">

</form>

echo "網友:".$HTTP_COOKIE_VARS["ccauser"]."你已經登入了"; //如果已登入則顯示提示

$str="<br><br><a href='exit.php'>退出社群</a>";

echo $str;

測試檔案test.php

include "global.php"; //把global.php檔案包含進來

$strWelcome="歡迎<font color=red>".$_SESSION['ccauser']."</font><br>";

echo $strWelcome; //顯示歡迎資訊

$str=” 目前線上使用者:<br>===================<br>”;

$con=" 1=1";

//提出session表中所有記錄即是目前線上使用者,未把遊客算在内

$result=$session->get_from_condition($con);

while($row=mysql_fetch_array($result)){

$con1="userid=$row[userid]";

$user->get_from_condition($con1);

$str.=$user->username." ";

<br><a href='exit.php'>退出社群</a>

退出檔案exit.php

      include "global.php"; //把global.php檔案包含進來

      if ($_SESSION["online"]=="on"){

      $con="userid=$userid";

          $session->del($con); //在session表中删除使用者資訊。

          session_destroy();     //結束目前的會話,并清空會話中的所有資源

          echo "已經退出社群......";