PHP实现起来麻烦点,
1、建立用户在线表,主要有两个字段,用户ID,用户最近活动时间2、用户登陆后,每一次刷新页面都要将其动作时间记入在线表3、要专门有一个程序不断读取在线表,如果用户上次的活动时间与现在时间相比相差30分钟,那么该用户断线基本上就这样,这里面有一些优化措施要做,靠作者自己发挥了
1、建立用户在线表,主要有两个字段,用户ID,用户最近活动时间2、用户登陆后,每一次刷新页面都要将其动作时间记入在线表3、要专门有一个程序不断读取在线表,如果用户上次的活动时间与现在时间相比相差30分钟,那么该用户断线基本上就这样,这里面有一些优化措施要做,靠作者自己发挥了
session是和cookie相似的东西,都用于保存用户的私有信息。不同的是cookie保存于客户端而session保存于服务器端
既然是“私有信息”那么在不同的浏览器进程间是不能互访的不错,ASP可以通过endSession在用户注销session时通过修改Application中的变量值来达到记录用户状态的目的。当然也有例外php有session_destroy用于注销session,当然使用的是php预定的方式
但你可以用session_set_save_handler函数将php预定的处理转向你自己定义的函数。有如asp中修改global.asa一般一旦你设置了session处理函数,这些问题就都在你掌控之中了
当用户访问时,将用户名和登录时间记录到这个文件或表中;
当用户有动作时,刷新登录时间为动作时间;
当用户一定时间不活动时,从文件中删除该用户记录并删除session。
如果把session的处理交由自定义函数、数据保存于数据库中。
那么判断在线人数也只是一句查询指令了吧?
<?
$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函数也就是不会删除表里的一个记录,