2011-07-28 54 views
6

estoy usando CodeIgniter para mi aplicaciónsesión de CodeIgniter expira frecuencia

cuál es mi problema sesión está a punto de expirar incluso cuando el usuario está activo en el sitio.

Estos son los valores de la sesión .. estoy usando sesión de DB

$config['sess_cookie_name']  = 'ci_session'; 
$config['sess_expiration']  = 7200; 
$config['sess_encrypt_cookie'] = FALSE; 
$config['sess_use_database'] = TRUE; 
$config['sess_table_name']  = 'edu_sessions'; 
$config['sess_match_ip']  = FALSE; 
$config['sess_match_useragent'] = TRUE; 
$config['sess_time_to_update'] = 300; 

ninguna solución para esto.

ayuda que tengo solucionarlo

aquí es la CodeIgniter forum link

+0

Son ¿Estás seguro de que las sesiones se guardan correctamente en la base de datos? –

+0

No lo sé, pero cuando estoy usando más datos en sesión si la opción dbsession está habilitada, solo funciona la sesión, de lo contrario no funciona – nani1216

Respuesta

13

he tenido problemas con las sesiones de CI que vencen al azar. ¿Tiene AJAX o recursos dinámicos cargando la biblioteca de sesión? Si es así, imagina este escenario:

Presento una solicitud ajax (que pasa la ID de mi sesión CI con la cookie), y devuelve los resultados, PERO también estoy enviando otra solicitud (cargando una imagen dinámica, otra solicitud de AJAX, etc.) que sigue inmediatamente a la primera solicitud. La primera solicitud podría desencadenar el evento de 300 segundos "es hora de actualizar" y devolver una nueva cookie, pero la solicitud adicional está enviando la identificación de la sesión anterior, ¿verdad?

Entonces, CodeIgniter dice "oye, no puedes hacer eso" y crea una nueva sesión, invalidando ambas cookies que mi navegador ahora no sabe qué hacer.

Aquí hay un enlace foro he publicado hace un tiempo que entra en más detalles: http://codeigniter.com/forums/viewthread/172415/

+0

Gracias landons. mi aplicación tiene muchas llamadas dinámicas ajax como las que explicaste. Si tiene una solución para esto, por favor hágamelo saber. este es un problema serio en mi aplicación. Gracias – nani1216

+0

Extendería la clase Session y escribiría su propia función sess_destroy que verifica la función INPUT :: is_ajax_request() para evitar la caducidad normal de la sesión para solicitudes ajax. Tenga en cuenta que la función sess_read devolverá FALSE cada vez que llame a la función sess_destroy(), por lo que deberá anularla también. ¿Quieres un ejemplo de trabajo? – landons

+0

Ya, dame un ejemplo de trabajo, para poder hacerlo rápidamente. Gracias – nani1216

3

Como se mencionó en la primera respuesta, hay una condición de carrera en la biblioteca de la sesión, que desde entonces ha sido mitigado en cierta medida en la última versiones de CodeIgniter, incluida la rama 'desarrollo'. Esto implementa una comprobación isAjax en la rotación de la sesión, pero realmente no soluciona el problema subyacente.

2

¿Estás seguro de que la sesión se destruye? Creo que simplemente no se actualiza como se supone y crea una nueva en cada solicitud de página. (Tema ajuste común de CodeIgniter)

aquí está mi sugerencia:

revise su archivo/config.php application/config para asegurar que la parte del dominio de la sesión parece que si aloja el sitio en la principal directorio:

$config['cookie_prefix'] = ""; 
$config['cookie_domain'] = "yourdomain.com"; 
$config['cookie_path'] = "var/sessions/"; 
$config['cookie_secure'] = FALSE; 

y al igual que si aloja el sitio en un subdirectorio:

$config['cookie_prefix'] = ""; 
$config['cookie_domain'] = "yourdomain.com"; 
$config['cookie_path'] = "siteSubDirectory/var/sessions/"; 
$config['cookie_secure'] = FALSE; 

y también asegúrese de que los 2 directorios sean escribibles fijando sus permisos en 755 más o menos, y le recomiendo encarecidamente que habilite la sesión de la base de datos, sea más seguro y lo ayude a descubrir el problema real al consultar la tabla de sesiones. buena suerte :)

2

Voy a agregar una solución para este problema. si se realiza una llamada ajax entonces no actualizar la sesión extienden la clase de sesión mediante la adición de este archivo para las bibliotecas carpeta:

class MY_Session extends CI_Session { 

    // -------------------------------------------------------------------- 

    /** 
    * sess_update() 
    * 
    * @access public 
    * @return void 
    */ 
    public function sess_update() 
    { 
     $CI =& get_instance(); 

     if (! $CI->input->is_ajax_request()) 
     { 
      parent::sess_update(); 
     } 
    } 

} 
1

Sólo cambia ci_sessions codificar mesa para MyISAM: ALTER TABLE ci_sessions ENGINE = MyISAM;

+1

esto es lo que necesito, ¿sabes por qué no trabajar para InnoDB? ¡Gracias! – Jawaad

Cuestiones relacionadas