PHP实现起来麻烦点,
1、建立用户在线表,主要有两个字段,用户ID,用户最近活动时间2、用户登陆后,每一次刷新页面都要将其动作时间记入在线表3、要专门有一个程序不断读取在线表,如果用户上次的活动时间与现在时间相比相差30分钟,那么该用户断线基本上就这样,这里面有一些优化措施要做,靠作者自己发挥了

解决方案 »

  1.   

    首先把session弄清楚
    session是和cookie相似的东西,都用于保存用户的私有信息。不同的是cookie保存于客户端而session保存于服务器端
    既然是“私有信息”那么在不同的浏览器进程间是不能互访的不错,ASP可以通过endSession在用户注销session时通过修改Application中的变量值来达到记录用户状态的目的。当然也有例外php有session_destroy用于注销session,当然使用的是php预定的方式
    但你可以用session_set_save_handler函数将php预定的处理转向你自己定义的函数。有如asp中修改global.asa一般一旦你设置了session处理函数,这些问题就都在你掌控之中了
      

  2.   

    需要一个文件或一个表专门用来存放在线用户。
    当用户访问时,将用户名和登录时间记录到这个文件或表中;
    当用户有动作时,刷新登录时间为动作时间;
    当用户一定时间不活动时,从文件中删除该用户记录并删除session。
      

  3.   

    与ustb(偶然) 讨论一下
    如果把session的处理交由自定义函数、数据保存于数据库中。
    那么判断在线人数也只是一句查询指令了吧?
      

  4.   

    给xuzuning(唠叨)
    <?
    $SESS_DBHOST = "localhost"; // mysql主机
    $SESS_DBNAME = "db"; // 数据库名称
    $SESS_DBUSER = "root"; // 数据库用户
    $SESS_DBPASS = ""; // 数据库密码$SESS_DBH = "";
    $SESS_LIFE = get_cfg_var("session.gc_maxlifetime"); 
       
    function sess_open($save_path, $session_name) { 
      global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH; 
       
      if (! $SESS_DBH = mysql_connect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
        echo "<li>Can't connect to $SESS_DBHOST as $SESS_DBUSER"; 
        echo "<li>MySQL Error: ", mysql_error(); 
        die; 
      }
       
      if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) { 
        echo "<li>Unable to select database $SESS_DBNAME"; 
        die; 
      } 
      return true; 

       
    function sess_close() { 
      return true; 

       
    function sess_read($key) { 
      global $SESS_DBH, $SESS_LIFE; 
       
      $qry = "SELECT value FROM sessions WHERE sesskey = '$key' AND expiry > " . time(); 
      $qid = mysql_query($qry, $SESS_DBH); 
       
      if (list($value) = mysql_fetch_row($qid)) { 
        return $value; 
      }   return false; 

       
    function sess_write($key, $val) { 
      global $SESS_DBH, $SESS_LIFE; 
       
      $expiry = time() + $SESS_LIFE; 
      $value = addslashes($val); 
       
      $qry = "REPLACE INTO sessions VALUES ('$key', $expiry, '$value')"; 
      $qid = mysql_query($qry, $SESS_DBH); 
      return $qid; 

       
    function sess_destroy($key) { 
      global $SESS_DBH; 
       
      $qry = "DELETE FROM sessions WHERE sesskey = '$key'"; 
      $qid = mysql_query($qry, $SESS_DBH); 
       
      return $qid; 

       
    function sess_gc($maxlifetime) { 
      global $SESS_DBH,$SESS_LIFE;
       
      $qry = "DELETE FROM sessions WHERE expiry < " . time(); 
      $qid = mysql_query($qry, $SESS_DBH); 
       
      return mysql_affected_rows($SESS_DBH); 
    }
       
    session_set_save_handler( 
      "sess_open", 
      "sess_close", 
      "sess_read", 
      "sess_write", 
      "sess_destroy", 
      "sess_gc"); 
    ?>我有了上面这个文件后.像你说的"php有session_destroy用于注销session,当然使用的是php预定的方式但你可以用session_set_save_handler函数将php预定的处理转向你自己定义的函数。有如asp中修改global.asa一般" 可是在我的程序中只有用户正常退出时由程序去调用session_destory() 才会删除表记录.而当用户不正常退出时如:用户关闭浏览器后,为什么就不会执行session_destroy 也就是说不会执行上面这个文件的sess_destroy函数也就是不会删除表里的一个记录,