在考慮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<http://www.phpobject.net> 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;
}
}
?>
新聞熱點
疑難解答