我做了一个类似的,不过没有用session。我用来显示在线人数的页面是个框架页面。其中一页是隐藏的,用来刷新用。可以用<meta>给它定一个刷新时间,每次刷新的时候在服务器特定目录下建立一个以用户id命名的文件。每次刷新时在这个文件中写入服务器当前时间。显示在线人数的页面每次打开的时候编历那个存以用户id命名文件的目录。分别读取其中时间,(或者直接读文件最后修改时间,这样前面就不用刷新时写时间,只要重新再建立这个文件)判断这个时间和当前服务器的时间差,大于某个值就表示用户下线,然后删除这个文件。否则表示用户在线。
依据此原理,你也可以在这个文件里写入一些开关变量,判断用户是否有新的留言。然后决定是否再打开一个显示留言的页面。
如果你有兴趣,我可以把原程序发到你的邮箱里。哦,对了,我还不知道你的邮箱。
以上是用php4.0版本实现的。php4.3或以后版本好象还有更好的办法。
如果是用户已经登陆,实现网络寻呼功能的。比如a呼叫b,b端就弹出窗口,我就只能以来java实现了。
其实以上的用cookie也可以完成,不过有些浏览器不一定支持。
用session的话也可以,如果用户量很少就可以。

解决方案 »

  1.   

    谢谢楼上上的达人.
    [email protected]
     我 的EMAIL
      

  2.   

    楼上的兄弟你把那个程序也发给我一份行吗?
    谢谢![email protected]
      

  3.   

    我是这样想的,不知道对不对
    //注册用户表
    id
    num1 //以前留言数
    num2  //最新留言数
    time  //在线时间//在线弹出留言框
    注册用户其中有两个字段,num1,num2分别代表以前留言数和新的留言数
    如果新的留言数大于以前的留言数就弹出窗口,如
    <iframe src="不停刷新得到新留言数的页面,假设为refresh.php" width="0" height="0"></iframe>
    refresh.php中用window.open()打开那个留言页面//在线人数的判断
    建一个在线人单表
    id  registerid
    登陆这次页面时,读一下这个表,根据注册id知道这个成员的最新时间,如果时间超过一定值就删除在线人单表中这个人,然后弹出此人已离线。
      

  4.   

    这是我说的方法的源程序:
    然后调用这个类就可以实现了。
    <?
    //本类要求对用户名有限制,其位数不能超过类中的格式化数据的$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--;
    }
    }
    }
    ?>
      

  5.   

    php基本上就不是做这种东西用的,要实现多用户在线并且自动刷新数据库还是需要服务器端的支持,j2ee好一点