Ao considerar a questão da sessão, finalmente desisti dela:
1. A sessão original é gerenciada por meio de arquivos. A qualidade do sistema de arquivos afeta diretamente o desempenho da sessão, principalmente quando há várias K pessoas online ao mesmo tempo. Existem duas soluções: banco de dados e arquivo (usando caminho hash).
2. A sessão original tem pouca escalabilidade e controlabilidade. Não é propício à integração com meu sistema existente.
3. Ao escolher um banco de dados, não escolhi o sqlite. A última vez que testei a eficiência do sqlite no win xp, não foi tão boa quanto o esperado.
Por fim, escolhi a tabela heap do myql para processar sessões e combinei o processamento de sessões com estatísticas de usuários online.
O código fornecido abaixo é um exemplo meu (nenhum outro detalhe é fornecido, o uso específico deve ser modificado de acordo)
<?
/**
* Lidar com usuários online e simular sessões
* CREATE TABLE `webqq_session` (
`sid` char( 32 ) NOT NULL ,
`uid` middleint( 8 ) NÃO NULO ,
`nome de usuário` char( 80 ) NÃO NULO ,
`ismember` tinyint( 1 ) NÃO NULL ,
`logintime` int(10) NÃO NULO,
`activetime` int(10) NÃO NULO,
CHAVE PRIMÁRIA (`sid`)
) MOTOR = HEAP DEFAULT CHARSET = gb2312
* @autor:feifengxlq< http://www.phpobject.net > feifengxlq#gmail.com
* @desde:23/10/2006
* @copyright: http://www.phpobject.net
*Obs: O uso deste arquivo deve ser combinado com outros arquivos: como filtragem de cookies, algumas funções básicas e classes de operação de banco de dados
*/
sessão de aula
{
var $mysql;
var $cookie_id='webqq_sid';
var $sessão=array();
var $max_time=1200;//O tempo máximo padrão é 20 minutos
função__construir()
{
$this->mysql=new module(TB_PREX.'_session');//Requer suporte externo
$this->start();
}
função iniciar()
{
if(vazio($_COOKIE[$this->cookie_id]))
{
//Inicializa sessão
$this->criar();
}outro{
//O cookie já existe, verifique se existe no banco de dados
$sid=$_COOKIE[$this->cookie_id];
if($this->mysql->detail('where sid=''.$sid.'''))
{
//Existe no banco de dados
$row['activetime']=tempo();
$this->mysql->update($row,'where sid=''.$sid.''');
$this->session=$this->mysql->detail('where sid=''.$sid.''');
}outro{
//Não existe no banco de dados
$this->criar();
}
}
//Exclui usuários que não estão online no banco de dados
$this->mysql->delete('where activetime+'.$this->max_time.'<'.time());
}
registro de função ($nome,$valor,$atualização=falso)
{
if(array_key_exists($nome,$this->sessão)){
$this->sessão[$nome]=$valor;
}
if($atualizar)$this->atualizar();
}
registro de função($nome='')
{
if(empty($nome)) return $this->session;
if(array_key_exists($nome,$this->sessão)){
return $this->sessão[$nome];
}
}
//Atualiza informações da sessão no banco de dados
atualização de função()
{
$row['uid']=$this->session['uid'];
$row['nomedeusuário']=$this->sessão['nomedeusuário'];
$row['ismember']=$this->session['ismember'];
$row['logintime']=$this->session['logintime'];
$row['activetime']=$this->session['activetime'];
$this->mysql->update($row,'where sid=''.$this->session['sid'].''');
}
/*------------------A seguir estão os métodos privados------------------------- -----------------**/
funçãocriar()
{
$horaagora=tempo();
$sid=md5('0'.$nowtime.getip());//A função getip() precisa ser predefinida: obtenha o endereço IP do cliente
setcookie($this->cookie_id,$sid,$nowtime+3600*24); //padrão 24 horas
$linha['sid']=$sid;
$linha['uid']=0;
$row['nomedeusuário']='convidado';
$row['ismember']=0;
$row['logintime']=$agora;
$row['activetime']=$agora;
$this->mysql->add($row);//Escreve no banco de dados
$this->session=$linha;
}
}
?>