我為什麼不使用session

日期:2008-07-05  作者:喜騰小二  來源:PHPChina


 在考慮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
;
    }
}
?>

<<<返回技術中心

技術文章

站內新聞

我要啦免费统计