程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 我為什麼不使用session

我為什麼不使用session

編輯:關於PHP編程

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved