세션 문제를 고려할 때 마침내 세션을 포기했습니다.
1. 원본 세션은 파일을 이용하여 관리됩니다. 파일 시스템의 품질은 특히 여러 K명이 동시에 온라인에 있는 경우 세션 성능에 직접적인 영향을 미칩니다. 솔루션에는 데이터베이스와 파일(해시 경로 사용)이라는 두 가지 솔루션이 있습니다.
2. 원본 세션은 확장성과 제어성이 좋지 않습니다. 기존 시스템과 통합하는 데 도움이 되지 않습니다.
3. 데이터베이스를 선택할 때 sqlite를 선택하지 않았습니다. 지난번 win xp에서 sqlite의 효율성을 테스트했는데, 기대만큼 좋지 않았습니다.
마지막으로 세션을 처리하기 위해 myql의 힙 테이블을 선택하고 세션 처리를 온라인 사용자 통계와 결합했습니다.
아래 제공된 코드는 내 코드의 예입니다(다른 세부 정보는 제공되지 않으며 그에 따라 특정 용도를 수정해야 함).
<?
/**
* 온라인 사용자 처리 및 세션 시뮬레이션
* CREATE TABLE `webqq_session` (
`sid` char( 32 ) NOT NULL ,
`uid` mediaint( 8 ) NOT NULL ,
`사용자 이름` char( 80 ) NOT NULL ,
`ismember`tinyint( 1 ) NOT NULL ,
`logintime` int( 10 ) NOT NULL ,
`activetime` int( 10 ) NOT NULL ,
기본 키(`sid`)
) 엔진 = 힙 기본 문자 집합 = gb2312
* @author:feifengxlq< http://www.phpobject.net > feifengxlq#gmail.com
* @since:2006-10-23
* @copyright:http://www.phpobject.net
* 참고: 이 파일을 사용하려면 쿠키 필터링, 일부 기본 기능 및 데이터베이스 작업 클래스와 같은 다른 파일과 결합해야 합니다.
*/
수업 세션
{
var $mysql;
var $cookie_id='webqq_sid';
var $session=배열();
var $max_time=1200;//기본 최대 시간은 20분입니다.
함수__구조()
{
$this->mysql=new module(TB_PREX.'_session');//외부 지원 필요
$this->시작();
}
함수 시작()
{
if(empty($_COOKIE[$this->cookie_id]))
{
//세션 초기화
$this->create();
}또 다른{
//쿠키가 이미 존재합니다. 데이터베이스에 존재하는지 확인하세요.
$sid=$_COOKIE[$this->쿠키_ID];
if($this->mysql->detail('where sid=''.$sid.'''))
{
//데이터베이스에 존재
$row['activetime']=시간();
$this->mysql->update($row,'where sid=''.$sid.''');
$this->session=$this->mysql->detail('where sid=''.$sid.''');
}또 다른{
//데이터베이스에 존재하지 않습니다.
$this->create();
}
}
//데이터베이스에서 온라인 상태가 아닌 사용자를 삭제합니다.
$this->mysql->delete('where activetime+'.$this->max_time.'<'.time());
}
함수 레지스터($name,$value,$update=false)
{
if(array_key_exists($name,$this->session)){
$this->세션[$name]=$value;
}
if($update)$this->update();
}
함수 레지스트리($name='')
{
if(empty($name)) return $this->session;
if(array_key_exists($name,$this->session)){
$this->세션[$name]을 반환합니다.
}
}
//데이터베이스의 세션 정보 업데이트
함수 업데이트()
{
$row['uid']=$this->세션['uid'];
$row['사용자 이름']=$this->세션['사용자 이름'];
$row['ismember']=$this->세션['ismember'];
$row['logintime']=$this->세션['logintime'];
$row['activetime']=$this->세션['activetime'];
$this->mysql->update($row,'where sid=''.$this->session['sid'].''');
}
/*------다음은 개인 메소드입니다------------ --------**/
함수생성()
{
$nowtime=시간();
$sid=md5('0'.$nowtime.getip());//getip() 함수는 사전 정의되어야 합니다: 고객의 IP 주소를 얻습니다.
setcookie($this->cookie_id,$sid,$nowtime+3600*24);//기본값은 24시간입니다.
$row['sid']=$sid;
$row['uid']=0;
$row['사용자 이름']='손님';
$row['ismember']=0;
$row['logintime']=$nowtime;
$row['activetime']=$nowtime;
$this->mysql->add($row);//데이터베이스에 쓰기
$this->세션=$row;
}
}
?>