Al considerar el tema de la sesión, finalmente abandoné la sesión:
1. La sesión original se gestiona mediante archivos. La calidad del sistema de archivos afecta directamente al rendimiento de la sesión, especialmente cuando hay varias K personas conectadas al mismo tiempo. Hay dos soluciones: base de datos y archivo (usando ruta hash).
2. La sesión original tiene poca escalabilidad y controlabilidad. No es propicio para la integración con mi sistema existente.
3. Al elegir una base de datos, no elegí sqlite. La última vez que probé la eficiencia de sqlite en win xp, no fue tan buena como esperaba.
Finalmente, elegí la tabla de montón de myql para procesar sesiones y combiné el procesamiento de sesiones con estadísticas de usuarios en línea.
El código que figura a continuación es un ejemplo mío (no se proporcionan otros detalles, el uso específico debe modificarse en consecuencia)
<?
/**
* Manejar usuarios en línea y simular sesiones.
* CREAR TABLA `webqq_session` (
`sid` char(32) NOT NULL,
`uid` mediumint(8) NO NULO,
`nombre de usuario` char (80) NO NULO,
`ismember` tinyint (1) NO NULO,
`logintime` int(10) NO NULO,
`activetime` int(10) NO NULO,
CLAVE PRIMARIA (`sid`)
) MOTOR = JUEGO DE CARACTERES PREDETERMINADO DEL MONTÓN = gb2312
* @autor:feifengxlq< http://www.phpobject.net > feifengxlq#gmail.com
* @desde:2006-10-23
* @copyright:http://www.phpobject.net
* Nota: El uso de este archivo debe combinarse con otros archivos: como filtrado de cookies, algunas funciones básicas y clases de operación de bases de datos.
*/
sesión de clase
{
var$mysql;
var $cookie_id='webqq_sid';
var $sesión=matriz();
var $max_time=1200;//El tiempo máximo predeterminado es 20 minutos
función__construcción()
{
$this->mysql=new module(TB_PREX.'_session');//Requiere soporte externo
$esto->inicio();
}
inicio de función()
{
si(vacío($_COOKIE[$this->cookie_id]))
{
//Inicializar sesión
$esto->crear();
}demás{
//La cookie ya existe, verifica si existe en la base de datos
$sid=$_COOKIE[$this->cookie_id];
if($this->mysql->detail('donde sid=''.$sid.'''))
{
//Existe en la base de datos
$fila['tiempoactivo']=tiempo();
$this->mysql->update($fila,'donde sid=''.$sid.''');
$this->session=$this->mysql->detail('donde sid=''.$sid.''');
}demás{
//No existe en la base de datos
$esto->crear();
}
}
//Eliminar usuarios que no están en línea en la base de datos
$this->mysql->delete('donde activetime+'.$this->max_time.'<'.time());
}
registro de función($nombre,$valor,$actualización=falso)
{
if(array_key_exists($nombre,$esta->sesión)){
$this->sesión[$nombre]=$valor;
}
if($actualización)$this->actualización();
}
registro de funciones($nombre='')
{
if(vacío($nombre)) devuelve $esta->sesión;
if(array_key_exists($nombre,$esta->sesión)){
return $this->sesión[$nombre];
}
}
//Actualizar información de la sesión en la base de datos
actualización de función()
{
$fila['uid']=$this->sesión['uid'];
$fila['nombre de usuario']=$this->sesión['nombre de usuario'];
$fila['ismember']=$this->session['ismember'];
$fila['logintime']=$this->session['logintime'];
$fila['activetime']=$this->session['activetime'];
$this->mysql->update($row,'where sid=''.$this->session['sid'].''');
}
/*------------------Los siguientes son métodos privados--------------------------------- --------------------------------**/
funcióncrear()
{
$tiempoahora=tiempo();
$sid=md5('0'.$nowtime.getip());//La función getip() debe estar predefinida: obtenga la dirección IP del cliente
setcookie($this->cookie_id,$sid,$nowtime+3600*24);//predeterminado 24 horas
$fila['sid']=$sid;
$fila['uid']=0;
$fila['nombre de usuario']='invitado';
$fila['ismember']=0;
$fila['logintime']=$ahora;
$fila['activetime']=$nowtime;
$this->mysql->add($row);//Escribir en la base de datos
$esta->sesión=$fila;
}
}
?>