2010-08-13 11 views
29

estoy usando sesiones de PHP en mi sitio web y parece como que están "desapareciendo" a intervalos aleatorios. No sé si se agotan debido a la inactividad o si algo está mal con mi código, pero ¿hay alguna forma de controlar las sesiones cuando caducan?sesiones de PHP tiempo de espera demasiado rápido

Como puedo poner algo en mi código o cambiar algo en el archivo php.ini?

Update- Así que solo y actualiza aquí, cambié hosts y mágicamente las sesiones comenzaron a funcionar. No tengo idea de qué estaba mal, pero aparentemente no querían funcionar correctamente.

+2

Encontrará su respuesta aquí: http://stackoverflow.com/questions/1516266/how-long-will-my-session-last/1516284 – svens

+2

Eso fue increíble gracias. En realidad, fue esto lo que terminó siendo extremadamente útil: http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes/1270960#1270960 – jefffan24

+1

Eso fue incluso más impresionante, gracias :) – svens

Respuesta

42

La expiración aleatoria es un síntoma clásico del directorio de datos de sesión compartido por varias aplicaciones: es probable que la que tiene el menor tiempo session.gc_maxlifetime elimine datos de otras aplicaciones. El motivo:

  1. PHP almacena los archivos de sesión en el directorio temporal del sistema de forma predeterminada.
  2. El controlador de archivos incorporado no saber quién es dueño de qué archivo de sesión (que sólo coincide con el nombre del archivo ID de sesión):

    Nothing bug good old files

Mi consejo es que se configura una sesión personalizado privada directorio para su aplicación. Eso se puede hacer con el session_save_path() function o estableciendo el session.save_path configuration directive. Consulte la documentación de su marco para obtener los detalles precisos sobre cómo hacerlo en su propia base de código.

+0

¿Sugiere insertar esto en cada página? – JM4

+3

@ JM4 - Eche un vistazo a la familia de declaraciones [include] (http://php.net/include). –

+0

entiendo incluir y requiere. Si el OP tiene cientos o miles de páginas, esto sería una pesadilla si no imposible. Buscar y reemplazar es posible suponiendo que todas las páginas tienen algún tipo de estructura básica, pero todavía parece una forma realmente extraña de hacerlo. – JM4

2

intenta utilizar esta parte del código:

session_start(); 
    $inactive = 600; 
    $session_life = time() - $_SESSION['timeout']; 
    if($session_life > $inactive) { 
    session_destroy(); 
    header("Location: logoutpage.php"); 
    } 
    $_SESSION['timeout']=time(); 
+0

Está bien, así que tengo una página php de biblioteca que se incluye en todas las páginas del sitio, supongo que cada vez que inicien sesión comenzaría el tiempo de espera de la sesión. ¿Utilizaría ese bit de código en la biblioteca para que cada vez que carguen una página, actualice su actividad? – jefffan24

+0

Esto destruirá todas las sesiones después de 10 minutos de inactividad. Elimina todo lo que esperas de la primera y la última línea de este código y tendrás la respuesta real a la pregunta. – svens

+2

¡Y por amor al bien, prueba la existencia de variables antes de usarlas! Asumiendo que $ _SESSION ['timeout'] sea válido es Bad (TM) – Fake51

6

Se puede utilizar la técnica de hacer compatible su aplicación de acuerdo con usted .. Tienes que hacer algunos cambios de acuerdo a su sistema

// Get the current Session Timeout Value 
$currentTimeoutInSecs = ini_get(’session.gc_maxlifetime’); 

Cambiar el valor de tiempo de espera de la sesión

// Change the session timeout value to 30 minutes // 8*60*60 = 8 hours 
ini_set(’session.gc_maxlifetime’, 30*60); 
//————————————————————————————– 

// php.ini setting required for session timeout. 

ini_set(‘session.gc_maxlifetime’,30); 
ini_set(‘session.gc_probability’,1); 
ini_set(‘session.gc_divisor’,1); 

//if you want to change the session.cookie_lifetime. 
//This required in some common file because to get the session values in whole application we need to  write session_start(); to each file then only will get $_SESSION global variable values. 

$sessionCookieExpireTime=8*60*60; 
session_set_cookie_params($sessionCookieExpireTime); 
session_start(); 

// Reset the expiration time upon page load //session_name() is default name of session PHPSESSID 

if (isset($_COOKIE[session_name()])) 
    setcookie(session_name(), $_COOKIE[session_name()], time() + $sessionCookieExpireTime, “/”); 
    //————————————————————————————– 
    //To get the session cookie set param values. 

    $CookieInfo = session_get_cookie_params(); 

    echo “<pre>”; 
    echo “Session information session_get_cookie_params function :: <br />”; 
    print_r($CookieInfo); 
    echo “</pre>”; 

Todo lo mejor !!!!

+4

Realmente lo hace. Probablemente estés pensando en la caducidad de las cookies. –

12

Debian utiliza una tarea programada para expirar automáticamente las sesiones de una manera segura. Si está utilizando Debian, mire en /etc/cron.d/php5.

+0

Ubuntu también tiene un '/ etc/cron.d/php' que usa' session.gc_maxlifetime' en '/ etc/php/7.0/fpm/php.ini' para eliminar sesiones de'/var/lib/php/sessions '. –

Cuestiones relacionadas