您的位置:首页技术文章

我为什么不使用session

【字号: 日期:2023-10-10 19:59:00浏览:64作者:馨心

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

标签: PHP