Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Session_handler ,CollectGarbage y session.gc_maxlifetime =>Dudas

Estas en el tema de Session_handler ,CollectGarbage y session.gc_maxlifetime =>Dudas en el foro de PHP en Foros del Web. Antes que nada me gustaría presentarme y saludar a la comunidad ya que es mi primer post. Me gustaría comentaros una situación que se me ...
  #1 (permalink)  
Antiguo 15/06/2013, 12:15
 
Fecha de Ingreso: junio-2013
Mensajes: 6
Antigüedad: 10 años, 10 meses
Puntos: 0
Pregunta Session_handler ,CollectGarbage y session.gc_maxlifetime =>Dudas

Antes que nada me gustaría presentarme y saludar a la comunidad ya que es mi primer post. Me gustaría comentaros una situación que se me plantea y que arrojarais un poco de luz a una serie de cuestiones.Vamos el caso era la
creación de un sistema de sesiones para el logeo de usuarios y sus correspondientes acciones en función de sus privilegios y bla bla bla.Los problemas vienen a la hora de hacer este sistema de una forma un poco mas segura, el hosting donde puedo alojar el proyecto que estoy haciendo es un hosting compartido y decidi llevar el tema de las sesiones a una DB propia para que la informacion de las sesiones no estuvieran en el archivo temporal del hosting y las pudiera ver el que quisiera y supiera algo de lo que hay ahi.

Aqui un pequeño ejemplo de manejador (Esto es para local simplemente para montarlo )

Código PHP:
<?php

interface ISessionHandler {
    public function 
OpenSession($SavePath$SessionName);
    public function 
CloseSession();
    public function 
ReadFromSession($SessId);
    public function 
WriteToSession($SessId$SessionData);
    public function 
DestroySession($SessId);
    public function 
CollectGarbage($MaxLifeTime);
};

class 
SecureSessionHandler implements ISessionHandler {
    
    private 
$save_path NULL;
    private 
$conn NULL;

    public function 
OpenSession($SavePath$SessionName) {
        try {
            
$this->conn = new PDO('mysql:host=localhost;dbname=securedb','root','');
            return 
TRUE;
        } catch ( 
Exception $error ) {
            return 
FALSE;
        }    
    }

    public function 
CloseSession() {
        
$this->conn NULL;
    }

    public function 
ReadFromSession($SessId) {
        
$query "SELECT session_data FROM secure_sessions WHERE session_id = :sessid";
        
$st $this->conn->prepare($query);
        
$st->setFetchMode(PDO::FETCH_OBJ);
        
$res $st->execute(array(':sessid' => (string)$SessId));
        if ( 
$res ) {
            
$row $st->fetch();
            if ( 
$row ) {
                return 
$row->session_data;
            }    
        } 
        return 
'';
    }

    public function 
WriteToSession($SessId$SessionData) {
        
$query "SELECT session_id FROM secure_sessions WHERE session_id = :sessid";
        
$st $this->conn->prepare($query);
        
$res $st->execute(array(':sessid' => (string)$SessId));
        
$row $st->fetch();
        if ( 
$row ) {
            
$query "UPDATE secure_sessions SET session_data = :sessdata , session_lastaccesstime = NOW() WHERE session_id = :sessid";
            
$exst $this->conn->prepare($query);
        } else {
            
$query "INSERT INTO secure_sessions (session_id, session_data, session_lastaccesstime) VALUES(:sessid, :sessdata,NOW())";
            
$exst $this->conn->prepare($query);
        } 
        return 
$exst->execute(array(':sessid' => (string)$SessId':sessdata' => (string)$SessionData));
    }

    public function 
DestroySession($SessId) {
        
                
                
$query "DELETE FROM secure_sessions WHERE session_id = :sessid";
        
$st $this->conn->prepare($query);
        
$res $st->execute(array(':sessid' => (string)$SessId));
        
                return 
$res;
    }

    public function 
CollectGarbage($MaxLifeTime) {
    
                  
$query "DELETE FROM secure_sessions WHERE session_lastaccesstime < DATE_SUB(NOW(), INTERVAL " $MaxLifeTime " SECOND)";
                           
$st $this->conn->prepare($query);
                        
$res $st->execute();
                        return 
$res;
                 
    }
}
$session_handler = new SecureSessionHandler();
$open_handler = array($session_handler'OpenSession');
$close_handler = array($session_handler'CloseSession');
$read_handler = array($session_handler'ReadFromSession');
$write_handler = array($session_handler'WriteToSession');
$destroy_handler = array($session_handler'DestroySession');
$gc_handler = array($session_handler'CollectGarbage');

session_set_save_handler($open_handler$close_handler$read_handler$write_handler$destroy_handler$gc_handler);
?>
Todo funciona bien menos el recolector de basura que no me borra los datos de la DB si borro manualmente no hay ningún problema.Estaba realizando las pruebas cuando accede el usuario con estas premisas
ini_set("session.cookie_lifetime", 10);
ini_set("session.gc_maxlifetime", 10);
ini_set("session.gc_probability",100);

para que a los 10 segundos caducara la sesión y la probabilidad de que pasara el recolector fuera del 100%(mas que nada para ver que funciona todo el chiringuito)
Vamos por lo que tengo en mente de como funciona se supone que la Cookie del navegador caduca y php interpreta que a partir de los 10 segundos el contenido de esa sesión es no valido y por tanto llama al manejador para ejecutar el recolector de basura.Ideas?

PD:si es un fallo con la sintaxis PDO decidmelo please que solo lleva un un par de dias formando parte de mi vida.Gracias saludos
  #2 (permalink)  
Antiguo 16/06/2013, 03:45
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Session_handler ,CollectGarbage y session.gc_maxlifetime =>Dudas

No se puede comprobar lo que planteas si no posteas la implementación de esta clase.
Este tema es bastante antiguo y hay mil classes que hacen lo que tu quieres, mira esto para empezar: http://www.phpclasses.org/search.htm...ndler&restrict[0]=C&restrict[1]=B&restrict[2]=D&forums=F&go_search=1&advanced=1
Salu2
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 16/06/2013, 11:35
 
Fecha de Ingreso: junio-2013
Mensajes: 6
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Session_handler ,CollectGarbage y session.gc_maxlifetime =>Dudas

Gracias por la brevedad en reponder, un saludo repara2, puede ser que haya enfocado mal la pregunta, la cuestión en si es saber el modo en que trabaja php cuando nos definimos el handler de las sesiones ya que segun como yo lo estoy enterpretando se define la interfaz para que podamos sobreescribir los metodos por defecto que utiliza php y que estos realicen las mismas funciones con las variaciones que nos interesen.Mi duda esta en proceso de destruccion de la sesion y limpieza de los datos cuando un usuario sale de la session sin cerrarla explicitamente y saber si el recolector de basura como yo lo tengo definido esta bien definido o saber que es lo que me falta o en que me equivoco.Con respecto a lo de la clase como me preguntabas antes si que te la he posteado la tienes arriba.lo unico que hay que hacer para llamar a esta clase es incluirla en tu script de php , hacer un sesion_start() y a funcionar. De todas formas me ha sido de utilidad el link que me has pasado voy a echarle un ojo a una clase (Zebra_Session) que he encontrado y ver como solucionar lo del manejador un saludo cuando tenga algo lo subire.Un saludo
  #4 (permalink)  
Antiguo 16/06/2013, 14:04
 
Fecha de Ingreso: junio-2013
Mensajes: 6
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Session_handler ,CollectGarbage y session.gc_maxlifetime =>Dudas

Código PHP:
           public function CollectGarbage($MaxLifeTime) {
    
                    
$query "DELETE FROM secure_sessions WHERE  session_lastaccesstime < DATE_SUB(NOW(), INTERVAL  $MaxLifeTime  SECOND)";
                     
$st $this->conn->prepare($query);
                        
$res $st->execute();
                        return 
$res;
                 
    } 
Ya esta solucionado ya borra las sesiones antiguas ,le he cambiado la concatenación de la var $MaxLifeTime y me he puesto a realizar las comprobaciones de otra forma a como lo estaba haciendo y si que se las carga.
PD:La web del enlace que me pasaste chapo por cierto la clase Zebra_Session que te comentaba también funciona perfectamente.Un saludo

Etiquetas: select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:23.