Foros del Web » Programando para Internet » PHP »

Sesiones en database

Estas en el tema de Sesiones en database en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 19/12/2012, 09:18
 
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...
  #2 (permalink)  
Antiguo 20/12/2012, 08:22
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Sesiones en database

¿Es que nadie sabe? :(.
  #3 (permalink)  
Antiguo 20/12/2012, 08:28
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Sesiones en database

Primero estás usando un código de PHP4, recomiendo que vayas modificando a PHP5 y segundo el "garbage collector" funciona de acuerdo a
Código PHP:
Ver original
  1. ; Define the probability that the 'garbage collection' process is started
  2. ; on every session initialization.
  3. ; The probability is calculated by using gc_probability/gc_divisor,
  4. ; e.g. 1/100 means there is a 1% chance that the GC process starts
  5. ; on each request.
  6.  
  7. session.gc_probability = 1
  8. session.gc_divisor     = 1000
  9.  
  10. ; After this number of seconds, stored data will be seen as 'garbage' and
  11. ; cleaned up by the garbage collection process.
  12. session.gc_maxlifetime = 1440
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 20/12/2012, 09:09
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Pregunta Respuesta: Sesiones en database

Gracias por responder.
He modificado las siguientes configuraciones a:

session.gc_probability = 1
session.gc_divisor = 1
session.gc_maxlifetime = 10

Y sigue sin borrarme las sesiones... ¿acaso hago algo mal? :S.

Otra pregunta, ¿cómo sabes que es PHP4? Yo creía que era PHP5...

Última edición por kies89; 20/12/2012 a las 09:14
  #5 (permalink)  
Antiguo 23/12/2012, 10:31
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Desacuerdo Respuesta: Sesiones en database

¿Nadie ha programado nunca sesiones en bases de datos? :( joo
  #6 (permalink)  
Antiguo 23/12/2012, 11:29
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Sesiones en database

Y para que quieres guardar la session en una bd?

has ledio el manual correspondiente ??

http://es.php.net/manual/es/session.configuration.php

Etiquetas: database, mysql, sesiones, sql, tabla
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 03:11.