Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/06/2013, 12:15
Tse0
 
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