Tengo problemas con el sitio PHP que ejecuto en el trabajo donde los usuarios se desconectan después de unos minutos (el tiempo exacto varía, pero es lo suficientemente frecuente como para ser un problema), independientemente de si han estado utilizando activamente el sitio o no.Sesiones PHP que caducan temprano
La dificultad es que no puedo reproducir este problema, si inicio sesión como los mismos usuarios que usan el mismo navegador no me desconecto, lo que sugiere que no es un caso de que el sitio se rompa por completo. Lamentablemente, no tengo acceso a las máquinas de los usuarios para ejecutar ningún software de detección de tráfico.
Las cosas ya he controladas son:
- pidiendo a los usuarios a probar diferentes navegadores. Esto no parece resolver el problema y no es una solución a largo plazo, ya que no puedo determinar qué navegadores usarán los clientes.
- La hora del servidor es correcta y en línea con las máquinas del usuario.
- El usuario Apache se ejecuta como tiene permiso para escribir en la carpeta de la sesión, y puedo ver los archivos de sesión que se están creando y sus tiempos de modificación actualizados.
- No se están utilizando funciones de búfer de salida.
- El problema ocurre en una variedad de páginas que parecen no tener nada en común (es decir, no es que todas ellas utilicen AJAX, ni actualicen la base de datos ni ninguna otra razón).
- Los usuarios solo acceden a su cuenta desde una máquina, es decir, no hacen un poco de trabajo en su computadora portátil, cambian al escritorio y luego se preguntan por qué han cerrado sesión en su computadora portátil (no permitimos múltiples inicios de sesión simultáneos para el mismo usuario).
Los ajustes de sesión en PHP son los valores predeterminados de Debian, y no se han cambiado en un archivo .htaccess ni en ningún otro lugar. Los principales son:
session.cookie_lifetime 0
session.gc_divisor 100
session.gc_maxlifetime 1440
session.gc_probability 0
session.save_handler files
session.save_path /var/lib/php5
session.use_cookies On
Debian borra las sesiones a través de una tarea programada en lugar de usar recolector de basura de PHP, por lo que gc_probability se pone a 0. La versión de PHP nos estamos quedando es: PHP 5.2.6-1 + lenny13 con Suhosin-Patch 0.9.6.2 (cli) (última versión en Lenny, estaremos actualizando a Squeeze pronto, pero no creo que esa sea la causa del problema).
Usamos Zend_Session para gestionar sesiones, y una instancia de Zend_Session_Namespace se crea una vez en cada página, llamando automáticamente a session_start(). Las sesiones se borran llamando Zend_Session :: destroy() en la página de cierre de sesión, por lo que las únicas formas en que un usuario debe haber iniciado a cabo son:
- Si hacen clic explícitamente el enlace de desconexión (log que cuando esto sucede y que doesn Parece que la navegación es precargar la página y, por lo tanto, cerrar la sesión del usuario).
- Si dejan la sesión inactiva durante más de 24 minutos, en ese momento Debian probablemente eliminará su sesión (hay una tarea cron que se ejecuta cada media hora eliminando todas las sesiones que no se han modificado durante más de 24 minutos).
- Si cierran el navegador, se borrará su cookie de sesión con un tiempo de caducidad de 0.
Las comprobaciones para ver si un usuario está conectado son:
- Ellos tienen una sesión válida (comprobado por ver si se puede acceder a $ zsession-> user_id).
- Hay una fila en la tabla de sesiones que tiene un ID de usuario y una ID de sesión coincidentes, y esta última se actualizó hace menos de una hora. Borramos esta fila al cerrar la sesión de modo que incluso si la sesión todavía existe en el disco, nadie puede acceder a esa cuenta sin necesidad de acceder.
¿Puede alguien sugerir otras cosas que pueda intentar?
Editar: Algunas cosas adicionales que he probado en base a los comentarios restante:
- Configuración session.cookie_domain: Esto parece tener un comportamiento muy extraño en PHP. Si no configuro esta variable y la dejo como predeterminada de '' (cadena vacía), una solicitud de www.domain.com generará una cookie de www.dominio.com. Sin embargo, si configuro cookie_domain a 'www.dominio.com', el dominio de la cookie es '.www.domain.com' (aviso de punto líder, que significa válido para todo lo que se encuentre debajo de www.dominio.com, por ejemplo, subsitio.www .dominio.com).
- Configuración de session.cookie_lifetime: PHP no parece actualizar el tiempo de caducidad en cada solicitud, por lo que si configuro cookie_lifetime a 3600 la cookie caducará una hora después de que el usuario visite el sitio por primera vez, incluso si inician sesión y constantemente lo usan .
Edición 2: Sobre la base de otras cosas que la gente ha preguntado:
- El sitio está alojado en un centro de datos, en una VLAN separada. Nadie que acceda al sitio está en la misma red que el sitio.
- No se utiliza la autenticación IP ni la dirección IP del cliente en ninguna parte del proceso de la sesión (por ejemplo, no adjuntamos la sesión a una dirección IP y bloqueamos al usuario si su siguiente solicitud proviene de un IP diferente).
La última vez que tuve un problema similar, me olvidé de manejar las sesiones correctamente en cierto archivo php (todos los otros archivos estaban bien). El resultado fue que la sesión se volvió inválida después de que el usuario intentó abandonar esa determinada página, por lo que se desconectó después de diferentes tipos de minutos, dependiendo de cuándo navegaba a la página. No veo esto como una solución. Véalo como una pista donde podría buscar algunos errores. ¡Buena suerte! ^^ – Marco
Las zonas horarias (o el horario del servidor incorrecto) pueden causar problemas en algunos casos. – Smar
@Smar Es posible, pero dije explícitamente 'La hora del servidor es correcta y está en línea con las máquinas del usuario'. – pwaring