我爲什麽不使用session

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

}

}

?>

我爲什麽沒有使用Spring
  在這裏,Spring指的是Spring開發框架,一種依靠注入容器的實現。首先,我聲明我沒有一點冒犯Rod的意思(你是個優秀的人)。但是坦白地說,我不能狂熱的追隨您的開發框架。更爲嚴重的是,我注重到,我所考慮的這些...查看完整版>>我爲什麽沒有使用Spring
 
我爲什麽沒有使用Spring
  在這裏,Spring指的是Spring開發框架,一種依賴注入容器的實現。首先,我聲明我沒有一點冒犯Rod的意思(你是個優秀的人)。但是坦白地說,我不能狂熱的追隨您的開發框架。更爲嚴重的是,我注意到,我所考慮的這些...查看完整版>>我爲什麽沒有使用Spring
 
我爲什麽減少使用C++
選用那種編程語言作開發是一個非常複雜的問題。有時開發者是沒有選擇余地的,比如客戶可能出于某種原因規定項目必須采用某種語言,或者有決定權的經理因爲自己有過使用某一種語言的經曆而要求自己所管理的開發人員使...查看完整版>>我爲什麽減少使用C++
 
優化使用mysql存儲session
之前寫過兩篇文章《自定義SESSION(二)——數據庫保存》和《我爲什麽不使用session》 但後來發現都有問題。前者處理在實際中幾乎沒什麽用處,而且session回收還得自己另外處理。後者頻繁的操作數據庫,打來了很大的...查看完整版>>優化使用mysql存儲session
 
使用v$session視圖查看進程的詳細信息
 v$session 視圖的一個不太有名的特性是它能夠解碼由單個會話執行的實際命令。信息被編碼到一個非凡的字段 v$session_command。   ...查看完整版>>使用v$session視圖查看進程的詳細信息
 
介紹使用數據庫保存session的方法
  PHP的session默認是以文件方式保存在服務器端,並且在客戶端使用cookie保存變量,這就會出現一個問題,當一個用戶由于某種安全原因關閉了浏覽器的cookie,程序中的session相關操作將無法執行。 ...查看完整版>>介紹使用數據庫保存session的方法
 
使用xmlhttp和Java session監聽改善站內消息系統
使用XMLhttp和Java session監聽改善站內消息系統bromon 原創 引自:http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=25340  這個題目含有許多需要解釋的概念,最輕易說明的是“...查看完整版>>使用xmlhttp和Java session監聽改善站內消息系統
 
在asp.net中使用session常見問題集錦
問:爲什麽Session在有些機器上偶爾會丟失?答:可能和機器的環境有關系,比如:防火牆或者殺毒軟件等,嘗試關閉防火牆。問:爲什麽當調用Session.Abandon時並沒有激發Session_End方法?答:首先Session_End方法只支...查看完整版>>在asp.net中使用session常見問題集錦
 
一個關于session使用的討論
由于我前段時間在使用一個在一個本頁的查詢裏使用了session存儲了一個dataset,我的一起學.net的朋友就說我那樣是浪費資源。會降低性能的我首先考慮的是session存儲在那裏的是客服端還是在服務器端呢下面有篇文章給了...查看完整版>>一個關于session使用的討論
 
 
回到王朝網路移動版首頁