He escrito dos artículos antes, "Personalizar la SESIÓN (2): guardar la base de datos" y "Por qué no uso la sesión".
Pero luego se descubrió que había problemas. El primer procesamiento es casi inútil en la práctica y el reciclaje de sesiones debe manejarse por separado. Este último opera frecuentemente la base de datos, causando grandes problemas de rendimiento.
Después de una cuidadosa consideración en los últimos dos días, se dio un plan aproximado, pero no hubo una prueba específica y detallada.
1. Combine procesamiento de sesiones y estadísticas. También se registran los visitantes.
2. Utilice completamente la base de datos y las cookies para simular funciones de sesión.
3. Las operaciones del usuario en la sesión deben completarse en una declaración SQL tanto como sea posible. Cuando la sesión no es necesaria, no hay absolutamente más de una consulta.
4. En aras de la eficiencia, el reciclaje de sesiones no está integrado, pero se proporciona una interfaz a la que se puede llamar para implementarlo.
El código se proporciona temporalmente sin explicación detallada.
SQL
CREAR TABLA `*****_session` (
`sid` char(32) NO NULO,
`uid` int(10) NO NULO,
`nombre de usuario` char(32) NO NULO,
`tipo de usuario` tinyint(1) NO NULO,
`activetime` int(10) NO NULO,
`expiración` int(10) NO NULO,
`ip` char(15) NO NULO,
`url` char(80) NO NULO,
`valor` char(255) NO NULO,
CLAVE PRIMARIA (`sid`)
) MOTOR = JUEGO DE CARACTERES PREDETERMINADO DE MEMORIA = utf8;
codigo php
<?
sesión de clase {
privado $_sessionPrex= '';//prefijo de sesión
privado $_time = '';//hora actual
private $_model = null //Modelo de operación de base de datos
privado $_expiry = 1200;//tiempo de validez de la sesión
privado $_domain = '';//alcance de la sesión
protected $isNew = 0;//determinar operación acción 0 actualizar 1 aumentar
protected $sesión = array();//registro de sesión correspondiente
función pública __construct($opciones){
$this->_setOptions($opciones);
if(empty($this->_time))$this->_time = tiempo();
$this->session['activetime'] = $this->_time;
}
inicio de función pública(){
$this->_getSid();
}
conjunto de funciones públicas($clave,$valor){
if(in_array($key,array('uid','nombre de usuario','tipo de usuario','url','expiración'))){
if($clave == 'vencimiento'){
$this->_setCookie($this->_sessionPrex.'_sid',$this->session['sid'],$value);
$this->_setCookie($this->_sessionPrex.'_uid',$this->session['uid'],$value);
}
$this->sesión[$clave] = $valor;
}demás{
$otro = $this->sesión['valor'];
$otro[$clave] = $valor;
$this->session['valor'] = $otro;
}
}
función pública obtener($clave){
if(in_array($key,array('uid','nombre de usuario','tipo de usuario','url','expiración'))){
return $this->session[$key];
}demás{
if(isset($this->sesión['valor'][$clave])){
return $this->session['valor'][$clave];
}
devolver nulo;
}
}
función pública gc($archivo,$tiempo = 1200){
$última vez = file_get_contents($archivo);
if($última vez + $hora<$esta->_hora){
file_put_contents($archivo,$esta->_hora);
return $this->_model->delete('activetime+expiry<'.$this->_time);
}
}
función pública destruir(){
$this->session['uid'] = 0;
$this->session['nombre de usuario'] = '';
$this->session['tipo de usuario'] = -1;
$this->session['expiry'] = $this->_expiry;
$this->session['valor'] = matriz();
$this->_setCookie($this->_sessionPrex.'_sid',$this->session['sid'],$this->_expiry);
$this->_setCookie($this->_sessionPrex.'_uid',$this->session['uid'],$this->_expiry);
}
función pública __destruct(){
$this->_save();
}
función privada _save(){
$dbSession = $this->sesión;
$dbSession['valor'] = serialize($dbSession['valor']);
if(strlen($dbSession['value'])>255)$this->_error('session->value es demasiado largo!');
si($esto->esNuevo == 1){
//Aumentar
$this->_model->insert($dbSession);
}demás{
//renovar
$sid = $dbSession['sid'];
$this->_model->update(array_slice($dbSession,1),'sid=''.$sid.''');
}
}
función privada _getSession($sid){
$dbSession = $this->_model->detail('sid = ''.$sid.''');
if(!$dbSession)devuelve falso;
$dbSession['valor'] = unserialize($dbSession['valor']);
$esta->sesión = array_merge($dbSession,$esta->sesión);
devolver verdadero;
}
función privada _getSid(){
$sid = strip_tags($_COOKIE[$this->_sessionPrex.'_sid']);
si(strlen($sid)==32){
si($this->_getSession($sid)){
devolver verdadero;
}
}demás{
$sid = md5(tiempo().mt_rand(1000,10000));
$this->_setCookie($this->_sessionPrex.'_sid',$sid);
}
$this->_setCookie($this->_sessionPrex.'_uid',0);
$esta->sesión = matriz(
'uid' => 0,
'nombre de usuario' => '',
'tipo de usuario' => -1,
'tiempoactivo' => $this->_time,
'ip' => $this->_getip(),
'url' => strip_tags($_SERVER['REQUEST_URI']),
'expiración' =>$this->_expiry,
'valor' => matriz()
);
$esto->esNuevo = 1;
$this->session['sid'] = $sid;
}
función privada _setCookie($nombre,$valor,$expiración=0){
if(empty($vencimiento))$vencimiento = $this->_expiry;
si(vacío($este->_dominio)){
setcookie($nombre,$valor,$esta->_hora + $expiración,'/');
}demás{
setcookie($nombre,$valor,$este->_tiempo + $expiración,'/',$este->_dominio);
}
}
función privada _getip(){
devolver getip();
}
función privada _setOptions($opciones){
foreach ($opciones como $clave=>$valor){
if(in_array($key,array('sessionPrex','time','model','expiry','domain'))){
$clave = '_'.$clave;
$this->$key = $valor;
}
}
}
función privada _error($msg){
lanzar nueva Phpbean_Exception($msg);
}
}
?>
(Tenga en cuenta que este código no se puede utilizar directamente; este artículo proporciona principalmente una idea)