Por qué se pierden las variables de sesión PHP

Pocas cosas hay más frustrantes que ir a buscar algo donde sabés que lo dejaste y no encontrar nada.

¿Cómo es posible?

Pusiste el session_start() al comienzo como Dios manda.

El código es claro:

$_SESSION['user'] = $user;

¿Qué puede ser más simple?

Cuando hacés un echo $_SESSION['user'] en la misma página todo sale perfecto pero apenas clickeás en un link… nada por aquí, nada por allá.

Y lo peor de todo es que el código funciona perfectamente en tu XAMPP pero en tu hosting no.

¿Cómo puede ser?

Funcionó perfectamente bien durante meses y ahora, nadie sabe por qué, dejó de funcionar.

Obviamente, dejar el problema sin resolver no es opción… ¿qué clase de sitio no recuerda al usuario que está logeado?

No te preocupes, el manejo de sesiones en PHP es uno de los temas que más confusión trae a los que están recién empezando.

Te sugiero comenzar por entender bien cómo funcionan las sesiones de PHP.

En este artículo voy a explorar las causas más frecuentes que hacen que las variables de sesión se pierdan y qué podés hacer para solucionarlas.

Te dejo las preguntas que deberías hacerte:

¿Todas las páginas tienen el session_start?

En realidad, no es necesario que todas las páginas lo tengan… de hecho, hasta puede ser contraproducente.

Lo que es seguro es que todas las páginas donde necesites guardar o leer información de la sesión deben invocar esta función.

¿La llamada a session_start está antes de enviar contenido al cliente?

Esta pregunta puede parecer poco sensata. Después de todo, si la llamada a session_start estuviese después de enviar código al cliente verías un error como:

PHP Warning: session_start(): Cannot start session when headers already sent

¿no?

Pues… no necesariamente.

El error se producirá, eso es seguro, pero que lo veas o no en pantalla depende de lo que figure en tu archivo php.ini (Específicamente en la entrada display_errors).

¿El valor de session.use_cookies es 1?

Esta configuración determina que el mecanismo de propagación del ID de sesión sea el uso de una cookie.

Muchas veces ocurre que el valor que tenés en tu entorno local no se condice con el del hosting.

¿El navegador está generando la cookie de sesión?

Esto es fácil de verificar: usualmente esta cookie se llama PHPSESSID (aunque este nombre puede modificarse, también a través del archivo php.ini o la función ini_set).

Si esto no sucede habría que probar si otras cookies se están generando (Lo más probable es que no).

Esto puede deberse a la configuración del navegador (Que no acepta cookies).

La verdad es que en este caso no hay mucho que puedas hacer… más allá de pedir por favor a los visitantes del sitio que habiliten las cookies.

La buena noticia es que la gran mayoría sí lo harán 🙂

¿Cuál es el valor de session.cookie_lifetime?

La configuración session.cookie_lifetime determina cuánto tiempo debe el navegador mantener la cookie de sesión.

Si este tiempo es pequeño la cookie no vivirá lo suficiente como para llegar a la siguiente página.

¿La interacción desde el frontend es muy larga?

Este es un problema que se da mucho en las SPA (Aplicación de una única página) donde casi toda la interacción se da a través de JavaScript.

Si no se realiza ningún pedido al servidor en mucho tiempo se corre el riesgo de que la sesión se considere inactiva y se cierre automáticamente.

En este artículo podés ver un ejemplo de esto (y cómo solucionarlo).

¿Qué valor tiene session.save_path?

Esta configuración determina dónde se almacenan los archivos de sesión (asumiendo, claro, que el mecanismo de almacenamiento elegido sea en archivos).

Si este valor es incorrecto no habrá dónde guardar la información.

Si el valor corresponde a un directorio existente en tu servidor la siguiente pregunta es ¿los archivos de sesión están ahí?

Si no están es probable que haya un problema de permisos: debes validar que el usuario con el que ejecuta tu servidor web sea capaz de escribir allí.

Conclusión

Si estás teniendo problemas para recuperar las variables de sesión es muy probable que se deba a fallas en la configuración de tu entorno, no desesperes: todo tiene solución 🙂

Recorriendo esta lista de preguntas podrás identificar la causa específica de tu problema y resolverlo.

¡Vamos que los usuarios esperan!

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

9 comentarios

  1. Me está pasando el mismo problema:

    resultado:
    array(0) { }
    Warning: Undefined array key «id» in C:\xampp\htdocs\ISPMyAdmin\index3.php on line 4

    Ayuda por fa

  2. hola buen dia, tengo el mismo problema que se desaparecen las variables de sesion, pero lo que veo es que si uso el dominio http://www.xxxxxx.com se pierden, pero si uso la ip xx.xx.xx.xx si funciona, al igual que funciona en local solo afecta en el server de hosting con ubuntu 22.04 y al usar el nombre de dominio, alguna idea?

  3. ¿cuál sería o como tengo una buena configuración del entorno para que sirvan las sesiones en el Host Local desde Linux?

  4. La version del php usada esta asociada con la desaparicion de las variables de sesion. Esto porque antes el start session() se podia ejecutar desde cualquier punto del codigo.

  5. el session start lo coloco en la cabecera y es utilizado en todas las paginas(nose si es lo correcto?)y en algunas la sesiones no continen ningun valor pero en otras si.. estaba pensado en colcar los sesion star en cada una de ellas pero nose si funciones ya que se esta iniciando la sesion en la cabecera.

    1. Hola Hermes!

      Es raro lo que comentas… ¿estás seguro de que en todas las páginas está el session_start()? Otro detalle importante: el session_start debe estar antes que cualquier salida HTML.

      Exitos!

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.