欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

我为什么不使用session

程序员文章站 2022-03-30 16:57:35
...

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