我为什么不使用session

  •   2009-07-31/22:44
  •  在考虑session的问题上,我最终放弃了session:
      1、原本的session是使用文件来管理的。文件系统的好坏直接影响session的性能,尤其当有几K人同时在线的时候,尤其突出。解决方法有两个:数据库和文件(使用哈希路径)。
      2、原有session的扩展性和可控制性不好。不利于结合我现有的系统。
      3、在选用数据库的时候,我并没有选择sqlite,上次我测试sqlite效率在win xp上效率没有想象中的好。

      最后我选择了myql的heap表来处理session,并且把session处理和online在线用户统计结合起来。

      下面给出代码为我的一个实例(没提供其他的细节了,具体使用要相应修改)


    <?
    /**
      * 处理在线用户和对session的模拟
      * CREATE TABLE `webqq_session` (

    `sid` char( 32 ) NOT NULL ,
    `uid` mediumint( 8 ) NOT NULL ,
    `username` char( 80 ) NOT NULL ,
    `ismember` tinyint( 1 ) NOT NULL ,
    `logintime` int( 10 ) NOT NULL ,
    `activetime` int( 10 ) NOT NULL ,
    PRIMARY KEY ( `sid` )
    ) ENGINE = HEAP DEFAULT CHARSET = gb2312
      * @author:feifengxlq<> feifengxlq#gmail.com
      * @since:2006-10-23
      * @copyright:http://www.phpobject.net
      * 注意:这个文件的使用必须和其他文件结合:比如对cookid的过滤,一些基本函数和数据库操作类
    */
    class session
    {
        var $mysql;
       
        var $cookie_id='webqq_sid';
       
        var $session=array();
       
        var $max_time=1200;//默认最大时间为20分钟
       
        function __construct()
        {
            $this->mysql=new module(TB_PREX.'_session');//需要外部支持
            $this->start();
        }
       
        function start()
        {
            if(empty($_COOKIE[$this->cookie_id]))
            {
                //初始化session
                $this->create();
            }else{
                //cookie已经存在,检查是否存在数据库中
                $sid=$_COOKIE[$this->cookie_id];
                if($this->mysql->detail('where sid=\''.$sid.'\''))
                {
                   //存在数据库中
                   $row['activetime']=time();
                   $this->mysql->update($row,'where sid=\''.$sid.'\'');
                   $this->session=$this->mysql->detail('where sid=\''.$sid.'\'');
                }else{
                   //不存在数据库中
                   $this->create();
                }           
            }
            //删除数据库中不在线的用户
            $this->mysql->delete('where activetime+'.$this->max_time.'<'.time());
        }
       
        function register($name,$value,$update=false)
        {
            if(array_key_exists($name,$this->session)){
                $this->session[$name]=$value;
            }
            if($update)$this->update();
        }
       
        function registry($name='')
        {
            if(empty($name)) return $this->session;
            if(array_key_exists($name,$this->session)){
                return $this->session[$name];
            }
        }
        //更新数据库里面的session信息
        function update()
        {
            $row['uid']=$this->session['uid'];
            $row['username']=$this->session['username'];
            $row['ismember']=$this->session['ismember'];
            $row['logintime']=$this->session['logintime'];
            $row['activetime']=$this->session['activetime'];
            $this->mysql->update($row,'where sid=\''.$this->session['sid'].'\'');
        }
        /*-------------------以下为私有方法------------------------------------------------------**/
        function create()
        {
                $nowtime=time();
                $sid=md5('0'.$nowtime.getip());//需要预先定义好getip()函数:获取客户的IP地址
                setcookie($this->cookie_id,$sid,$nowtime+3600*24);//默认24小时
                $row['sid']=$sid;
                $row['uid']=0;
                $row['username']='guest';
                $row['ismember']=0;
                $row['logintime']=$nowtime;
                $row['activetime']=$nowtime;
                $this->mysql->add($row);//写入数据库
                $this->session=$row;
        }
    }
    ?>


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多