2012-06-30 8 views
10

¿Cómo puedo almacenar sesiones en la base de datos? lo hice usando este código:Sesiones de PHP en la base de datos

function write ($session_id, $session_data) 
// write session data to the database. 
{ 
    if (!empty($this->fieldarray)) { 
     if ($this->fieldarray['session_id'] != $session_id) { 
      // user is starting a new session with previous data 
      $this->fieldarray = array(); 
     } // if 
    } // if 

    if (empty($this->fieldarray)) { 
     // create new record 
     $array['session_id'] = $session_id; 
     $array['date_created'] = getTimeStamp(); 
     $array['last_updated'] = getTimeStamp(); 
     $array['session_data'] = addslashes($session_data); 
     $this->_dml_insertRecord($array); 
    } else { 
     // update existing record 
     if (isset($_SESSION['logon_user_id'])) { 
      $array['user_id'] = $_SESSION['logon_user_id']; 
     } // if 
     $array['last_updated'] = getTimeStamp(); 
     $array['session_data'] = addslashes($session_data); 
     $this->_dml_updateRecord($array, $this->fieldarray); 
    } // if 

    return TRUE; 

} // write 

Pero ¿cómo debo retirarlo de forma automática como antes. Me refiero a cómo eliminar sesiones después de tiempo de espera de forma automática?

+0

¿por qué no simplemente serializar el objeto $ _SESSION? –

Respuesta

-1

Al final de su código session_destroy(); para cerrar la sesión:

<?php 
    session_destroy(); 
?> 
1

Tuve que lidiar con esto hace mucho tiempo, y hay 2 soluciones, ninguna de las cuales es bonita, pero aquí va.

  1. En el orden de los acontecimientos (sin apretar), la secuencia de comandos comprobará para ver si había un ID de sesión se envía al servidor, entonces se verá si la sesión está en su base de datos, y si el período de sesiones ha expirado. Tan pronto como haya establecido la conexión a su sesión db, podría considerar ejecutar una consulta DELETE en todos los registros con una fecha de caducidad pasada la marca de hora actual. Luego busque la ID que el usuario acaba de enviar. Esta manera de limpieza se realiza cada vez que las personas usan su sitio

  2. La próxima manera, que podría considerar hacer además, es tener un trabajo CHRON u otro script automatizado que se ejecute cada cierto tiempo para limpiar las entradas caducadas de tu mesa de sesión Este es un buen método si su sitio recibe tráfico ligero e infrecuente.

Una combinación de métodos es esto. Con la secuencia de comandos cuando está validando su sesión, verifique la fecha de caducidad cuando se encuentran los datos de la sesión. si se encuentra la ID, pero la sesión ha expirado, elimine la sesión y comience una nueva. Si lo hace de esta manera, no tendrá que enfrentarse a demasiados problemas de colisión de ID ni a muchas consultas que ralenticen su servidor. Todavía puede ejecutar su trabajo crónico al final de cada día para ejecutar una limpieza completa.

Asegúrese de que si su sistema tiene un botón de cierre de sesión de algún tipo, el hecho de cerrar la sesión manualmente activará la eliminación de la sesión del usuario.

0

Eche un vistazo a HTTP_Session2. De docs PEAR:

HTTP_Session2 proporciona características adicionales, tales como almacenamiento de base de datos para los datos de sesión utilizando el paquete de base de datos y MDB2. También introduce nuevos métodos, como isNew(), useCookies(), setExpire(), setIdle(), isExpired(), isIdled() y otros.

Si desea implementar la suya, mire el código en MDB2.php dentro de ese paquete. Contiene un método de recolección de basura (gc), que combinado con session_set_save_handler debería hacer el truco.