2011-12-23 10 views
7

Tengo un par de unos pocos pregunta sobre las sesiones de PHP:algunas preguntas acerca de las sesiones de PHP

  1. Dado que el valor por defecto para session.gc_maxlifetime es 24 minutos entonces eso significa que cualquier archivo de sesión que no se modifica durante 24 minutos se eliminarán y la sesión caducará automáticamente.

  2. Si uso session_destroy() en mi código, la sesión se desarmará, pero el archivo de sesión en sí no se eliminará hasta que transcurran 24 minutos desde la última modificación.

  3. La única manera de extender la duración de la sesión (más de 24 minutos) es ampliar session.gc_maxlifetime a un valor mayor.

¿Son todos estos correctos o me salió algo mal al respecto?

Además, si guardo mis sesiones en una base de datos (usando session_set_save_handler()), ¿se aplicarán todas estas reglas?

Respuesta

5
  1. Casi. El archivo (sesión) no se eliminará inmediatamente, que está determinado por session.gc_probability y session.gc_divisor.

  2. No, la sesión se venció, pero la eliminación del archivo de sesión se determina como se indica en el punto anterior

  3. Eso es correcto normalmente, pero si se va a poner en práctica su propio manejador de sesión, podría alterar el comportamiento de caducidad de la sesión incluso de tal manera que se ignora session.gc_maxlifetime

almacenando la sesión en dB no debe alterar esas reglas, pero podría estirarse un poco, si quería.

edición:

Esto es más o menos cómo se puede registrar su propio gestor de sesiones (manejador de ser una clase) y luego hacer lo que quiera con él

En primer lugar, supongamos que tenemos una clase, que va a manejar sesiones para nuestra aplicación.

class MySession { 
    function open($save_path, $session_name) { 
    } 

    function close() { 
    } 

    function read($id) { 
    } 

    function write($id, $sess_data) { 
    } 

    function destroy($id) { 
    } 

    function gc($maxlifetime) { 
    } 
} 

Para registrar el manejador en php, sólo tiene que llamar session_set_save_handler función, como este en nuestro caso:

// register the session handler 
$sess = new MySession(); 
session_set_save_handler(array($sess, 'open'), 
        array($sess, 'close'), 
        array($sess, 'read'), 
        array($sess, 'write'), 
        array($sess, 'destroy'), 
        array($sess, 'gc')); 

Tenga en cuenta que en realidad hay mejores maneras de registrar el manejador de sí mismo, usted podría incluso haz esto en el constructor de tu clase, o de muchas otras maneras. Pero supongo que ese no es el punto aquí.

Lo importante es que aunque PHP le proporciona las variables necesarias que corresponden al comportamiento estándar de su mecanismo de gestión de sesión, no tiene que respetarlo (no es que lo recomiende).

Para responder un comentario a continuación, pasar por alto el parámetro maxlifetime, usted no hace caso de que en el método de GC y el uso lo que consideren necesario/derecha, por ejemplo (con código db pseudo):

function gc($maxlifetime) { 
    $sql = "DELETE * FROM MySession WHERE lastAccess < NOW()-3600"; 
    // execute the query, say I have PDO instance in $dbh variable 
    $dbh->execute($sql); 
} 

Voila, usted simplemente eludió por completo la configuración de la sesión de PHP al hacerlo usted mismo.

+0

Gracias por la respuesta. Una pregunta más: ¿Podría explicar más sobre el punto 3 en su respuesta? Actualmente estoy usando configuraciones predeterminadas para la gestión de sesiones. No tengo control sobre php.ini ya que es un servidor compartido, por lo que no puedo modificar session.gc_maxlifetime. Estoy pensando en usar una base de datos para almacenar sesiones y controlar el tiempo de vida de cada sesión de forma independiente (mediante el uso de una opción para recordarme). – Songo

+0

Gracias por la explicación. Me hiciste feliz :) – Songo

1
  1. correcta, session.gc_maxlifetime borrará el archivo de sesión cuando expire la sesión
  2. session_destroy no se elimina el archivo de sesión
  3. sí, esta la única manera. Después de que pueda desactivar la recolección de elementos no utilizados que se reproduce con el archivo session.gc_divider y crear un script para crear su propia colección de elementos no utilizados, la distribución basada en Debian lo hace de manera predeterminada.

Almacenar la sesión en alguna base de datos no cambiará esas reglas.

+0

Gracias por su respuesta. No tengo control sobre php.ini ya que es un servidor compartido, por lo que no puedo modificar session.gc_maxlifetime. Estoy pensando en usar una base de datos para almacenar sesiones y controlar el tiempo de vida de cada sesión de forma independiente (utilizando una opción para recordarme). ¿Es eso factible? – Songo

+1

Sí, eso es factible. – RageZ

+0

Cualquier tutorial o ejemplo realmente ayudaría :). En realidad, estoy usando Zend framework para que almacenar sesiones en una base de datos sea fácil. El problema es que no se menciona nada acerca de extender el tiempo de vida de la sesión independiente. Pensé que la función rememberMe() haría el truco, pero solo extiende el tiempo de vida de la cookie. – Songo

Cuestiones relacionadas