频道直达 - 专题 - 新闻 - 基础 - 高级 - 安装 - 技巧 - 数据库 - 手册 - PHP - Linux - Java - MySQL - Apache - 麻辣堂 - 狼盟 - Rails社群 - 搜索 - 下载 - 开源 - 论坛

我为什么不使用session

来源:www.phpres.com 作者:Angelover 出处:www.phpres.com 2007-9-11 17:34:42 进入讨论组
关 键 词: 使用 为什么 this session row sid // 数据库 mysql name

   最近一直在忙着开发webqq,顺手完善自己的库类(重新回到PHP4,同时参考ZF的一些设计思想)。

  在考虑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开发资源论坛讨论。
收藏此文】【 】【打印】【关闭
相关文章
图文推荐
论 坛 资 源
PHP开发资源网奋斗目标
阅读排行:
热门技术文档
最新图文档
本站编辑推荐:(本站开通Delphi4PHP专区,欢迎进入论坛交流!)
编缉最近更新文章
网站赞助商
搜索您感兴趣的内容
 
   网站首页 -  网站地图 -  网站合作 -  手册中心 -  通用网址 -  网站论坛 -  网站投稿 -  友情链接 -  帮助中心
版权所有:PHP开发资源网 © 2003-2008 通用网址:PHP资源网 合作媒体: 赛迪网IT技术
互联网违法和不良信息举报中心 | 不良信息举报信箱