Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/12/2012, 09:18
kies89
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Pregunta Sesiones en database

Hola Forosdelweb.

Estaba haciendo que mi web guardara las sesiones en la base de datos, pero pasados los 24 minutos que tarda por defecto en borrarse las sesiones tras la inactividad, no se borran.

Aquí el código del archivo que se incluirá:
sessions.php (uso PDO para manejar conexiones con la base de datos, pero las consultas funcionan perfectamente)
Código:
<?php
// Use: require_once("sessions.php");

class SessionManager
{
  var $life_time;

  function SessionManager()
  {
    // Read the maxlifetime setting from PHP.ini
    $this->life_time = get_cfg_var("session.gc_maxlifetime");

    // Register this object as the session handler
    session_set_save_handler
    ( 
      array( &$this, "open" ),
      array( &$this, "close" ),
      array( &$this, "read" ),
      array( &$this, "write"),
      array( &$this, "destroy"),
      array( &$this, "gc" )
    );

  }

   function open($save_path, $session_name)
   {
      global $sess_save_path;
      $sess_save_path = $save_path; // Don't need to do anything. Just return TRUE.

      return true;
   }

  function close() 
  {
    return true;
  }

  function read($id)
  {
    // Set empty result
    $data = '';

    // Fetch session data from the selected database
    $time = time();

    $db = new PDO('mysql:host=localhost; port=3306; dbname=web', 'root', 'password');
	$query = $db->prepare("SELECT session_data FROM sessions WHERE session_id = :id AND expires > :time");
    $query->execute(array(':id'=>$id, ':time'=>$time));
    $a = $query->rowCount();
	

    if ($a > 0)
    {
      $row = $query->fetch(PDO::FETCH_ASSOC);
      $data = $row['session_data'];
    }

    $db = NULL;

    return $data;
  }

   function write($id, $data)
   {
    // Build query                
    $time = time() + $this->life_time;

    $db = new PDO('mysql:host=localhost; port=3306; dbname=web', 'root', 'password');
	$query = $db->prepare("REPLACE sessions(session_id, session_data, expires) VALUES(:id, :data, :time)");
    $query->execute(array(':id'=>$id, ':data'=>$data, ':time'=>$time));
	$db = NULL;

    return TRUE;
   }

   function destroy($id)
   {
    $db = new PDO('mysql:host=localhost; port=3306; dbname=web', 'root', 'password');
	$query = $db->prepare("DELETE FROM sessions WHERE session_id = :id");
    $query->execute(array(':id'=>$id));
    $db = NULL;

    return TRUE;
   }

  function gc()
  {
    // Garbage Collection
    // Build DELETE query.  Delete all records who have passed

    //  the expiration time
    $db = new PDO('mysql:host=localhost; port=3306; dbname=web', 'root', 'password');

    $db->exec("DELETE FROM sessions WHERE expires < UNIX_TIMESTAMP()");
    $db = NULL;


    // Always return TRUE
    return true;
   }
}
?>


Este es el código que usaré para probar sessions.php
Código:
<?php
  require_once("sessions.php");

 $sess = new SessionManager();

 session_start();
 $_SESSION['nombre']='carlos';
 session_write_close();



Y esta es la tabla MySQL:
Código:
  CREATE TABLE  (sessions
   `session_id` varchar (100) NOT NULL default '',
   `session_data` text NOT NULL,
   `expires` int (11) NOT NULL default '0',
   PRIMARY KEY (`session_id`)
 ) TYPE = MyISAM;

Les agradecería mucho la ayuda que puedan brindarme :). Tengo pensado hacer un tutorial en PDF explicándolo todo paso a paso, pero me falla el recolector de basura... Que no va si es por database...