我做了一个类似的,不过没有用session。我用来显示在线人数的页面是个框架页面。其中一页是隐藏的,用来刷新用。可以用<meta>给它定一个刷新时间,每次刷新的时候在服务器特定目录下建立一个以用户id命名的文件。每次刷新时在这个文件中写入服务器当前时间。显示在线人数的页面每次打开的时候编历那个存以用户id命名文件的目录。分别读取其中时间,(或者直接读文件最后修改时间,这样前面就不用刷新时写时间,只要重新再建立这个文件)判断这个时间和当前服务器的时间差,大于某个值就表示用户下线,然后删除这个文件。否则表示用户在线。
依据此原理,你也可以在这个文件里写入一些开关变量,判断用户是否有新的留言。然后决定是否再打开一个显示留言的页面。
如果你有兴趣,我可以把原程序发到你的邮箱里。哦,对了,我还不知道你的邮箱。
以上是用php4.0版本实现的。php4.3或以后版本好象还有更好的办法。
如果是用户已经登陆,实现网络寻呼功能的。比如a呼叫b,b端就弹出窗口,我就只能以来java实现了。
其实以上的用cookie也可以完成,不过有些浏览器不一定支持。
用session的话也可以,如果用户量很少就可以。
依据此原理,你也可以在这个文件里写入一些开关变量,判断用户是否有新的留言。然后决定是否再打开一个显示留言的页面。
如果你有兴趣,我可以把原程序发到你的邮箱里。哦,对了,我还不知道你的邮箱。
以上是用php4.0版本实现的。php4.3或以后版本好象还有更好的办法。
如果是用户已经登陆,实现网络寻呼功能的。比如a呼叫b,b端就弹出窗口,我就只能以来java实现了。
其实以上的用cookie也可以完成,不过有些浏览器不一定支持。
用session的话也可以,如果用户量很少就可以。
[email protected]
我 的EMAIL
谢谢![email protected]
//注册用户表
id
num1 //以前留言数
num2 //最新留言数
time //在线时间//在线弹出留言框
注册用户其中有两个字段,num1,num2分别代表以前留言数和新的留言数
如果新的留言数大于以前的留言数就弹出窗口,如
<iframe src="不停刷新得到新留言数的页面,假设为refresh.php" width="0" height="0"></iframe>
refresh.php中用window.open()打开那个留言页面//在线人数的判断
建一个在线人单表
id registerid
登陆这次页面时,读一下这个表,根据注册id知道这个成员的最新时间,如果时间超过一定值就删除在线人单表中这个人,然后弹出此人已离线。
然后调用这个类就可以实现了。
<?
//本类要求对用户名有限制,其位数不能超过类中的格式化数据的$bitNum数,本类的用户名定义为10位;
//本类假定用户不会大于等于1000;
class online
{
//一个以用户名命名的文件,里面写入每次用户刷新的时间;
var $user_file;
//存放在线用户列表的文件,头部3个字符为在线人数,换行后写在线的用户;
//每写一个用户,跟着写一个换行;
var $online_file;
//存放删除空间记录的文件;
var $onlinedir;
//如果时间比较小于这个值,则认为用户不在线;
var $timer;
//当前在线人数;
var $num;
//当前在线人员列表;
var $user_list;
function online()
{
$this->onlinedir="./online/";
$this->timer=1;
}
//初始化在线人员名单文件夹和文件,如果没有则建立;
function init()
{
if(!is_dir($this->onlinedir))
mkdir($this->onlinedir,0700);
}
//取得当前在线人数;
function statistic()
{
$i=0;
$handle=opendir($this->onlinedir);
while($this->user_list[$i]=readdir($handle))
$i++;
$this->num=$i-2;
}
//取得在线人数;
function getNum()
{
$this->listCheck();
return $this->num;
}
//取得在线人员列表;
function getUserlist()
{
$this->listCheck();
return $this->user_list;
}
//用户加入在线人员名单;
function addUser($user)
{
$user_file=$this->onlinedir.$user;
if(is_file($user_file))
{
echo "错误,此用户已经登陆!";
return;
}
//建立一个以用户名命名的文件用来刷新;
//文件前8位是时间,后面8位是用户在online.dat文件中的开始指针;
$fp=fopen($user_file,"w");
$timer=date("mdHi");
fwrite($fp,$timer);
fclose($fp);
}
//用户每次刷新执行的操作,打开用户名文件把时间刷新写如;
function userRef($user)
{
$user=$this->onlinedir.$user;
if(!is_file($user))
{
echo "错误,此用户还没有登录!";
return;
}
$fp=fopen($user,"r+");
$timer=date("mdHi");
fwrite($fp,$timer);
fclose($fp);
}
function listCheck()
{
$this->statistic();
for($i=2;$i<$this->num+2;$i++)
$this->isOnline($this->user_list[$i]);
}
function isOnline($user)
{
$user=$this->onlinedir.$user;
$nowtime=date("mdHi");
$fp=fopen($user,"r");
$reftime=fgets($fp,9);
fclose($fp);
$limit=$this->timer;
if(($nowtime-$reftime)>$limit)
{
unlink($user);
$this->num--;
}
}
}
?>