| 導購 | 订阅 | 在线投稿
分享
 
 
 

我爲什麽不使用session

來源:互聯網  2008-12-22 08:09:26  評論

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

}

}

?>

在考慮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<[url=http://www.phpobject.net]http://www.phpobject.net[/url]> 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; } } ?>
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有