¿Cómo reiniciar Apache sin restablecer las sesiones de los usuarios?

8

El usuario ha iniciado sesión en un sitio web PHP> Reinicio Apache> El usuario debe iniciar sesión de nuevo.

¿Cómo prevenir esto? (No quiero que el usuario deba iniciar sesión nuevamente)

dowik
fuente
Para verificar: tienes la capacidad de editar el PHP, ¿verdad?
Peter Taylor
Si es su propia aplicación, sugeriría lo que @Jacob Hume ha sugerido a continuación y cambiar su aplicación para almacenar sesiones en una tabla de base de datos. En mi opinión, esto le da más control sobre su sitio, ya que puede obligar a los usuarios a cerrar sesión si es necesario de forma selectiva.
Anagio
Puedo editar PHP. Estoy usando un CMS (Drupal). También estoy usando APC y estaba buscando una solución de esta manera.
dowik

Respuestas:

6

Almacenar un token de sesión en una ubicación alternativa como copia de seguridad evitaría este problema. Aún puede mantener su información principal $_SESSION, pero mantenga un token de respaldo en:

  • Galletas
  • Registros de la base de datos
  • Almacenamiento local HTML5

Puede encontrar ayuda en esta pregunta de StackOverflow: mejores prácticas para tiempos de espera de sesión e inicio de sesión persistente en php .

Jacob Hume
fuente
Gracias por la respuesta y gracias el enlace. Estaba buscando una solución en el archivo de configuración del lado del servidor (tipo de "mantener sesiones durante el reinicio"). Pero parece que la solución está en el lado de la aplicación.
dowik
Oh mi ... De hecho, ¡simplemente estaba buscando "apache2ctl -k graceful"!
dowik
3

Los datos de su sesión no deben perderse solo porque Apache se apaga o reinicia a menos que los datos de la sesión se almacenen en la memoria y no se respalden en el disco (ya sea por el sistema de archivos o la base de datos). De lo contrario, podría reiniciar todo el servidor y la sesión aún persistiría. Los datos de la sesión están diseñados para almacenarse a largo plazo. La única vez que se pierde la sesión es si:

  1. El SID se pierde. Los datos de la sesión todavía existen en el lado del servidor, pero el cliente no puede recuperar el SID, por lo que no puede reiniciar la misma sesión. Esto puede suceder si la cookie SID caduca (si es una cookie) o si se pierden los enlaces de sesión (si el SID es un parámetro de URL) o si el SID no está configurado en el lado del servidor o se cambia sin notificar al cliente.

  2. Los datos de la sesión se eliminan del lado del servidor. Esto suele suceder cuando se ejecuta PHP Session Garbage Collector y ve que el archivo de sesión es anterior a session.gc_maxlifetime (que es 24 minutos por defecto). De lo contrario, puede suceder si la aplicación elimina explícitamente la sesión . En algunos servidores, el administrador también puede haber configurado un cronjob para limpiar los datos de la sesión anterior de forma regular.

Lèse majesté
fuente
Gracias por los detalles. Investigaré de esta manera. Pero en este momento, simplemente usaré el reinicio elegante que parece satisfacer mis necesidades.
dowik
@dowik: ¿Cómo se adapta un reinicio elegante a tu necesidad? ¿Tu problema ha perdido sesiones o descargas interrumpidas? Si es lo último, entonces el reinicio / apagado agraciado lo resolverá. Pero luego debe editar su pregunta para reflejar eso. Debido a que los reinicios elegantes no tienen nada que ver con las sesiones de PHP, y no ayudará a otros usuarios que intentan evitar que se pierdan las sesiones.
Lèse majesté
Intenté actualizar el título de mi pregunta reemplazando "sesiones de PHP" por "sesiones de usuarios" como se describe en el cuerpo de mi pregunta. ¿Mejor para ti? Para ser más precisos: uso APC. Cuando cambio el código en archivos PHP, necesito vaciar el caché de APC (reiniciar Apache es la forma más sencilla de hacerlo, lo sé). Con el argumento "reiniciar", los usuarios de mi sitio web deben iniciar sesión nuevamente. Mientras que con "agraciado", no lo hacen. Por eso "parece que se ajusta a mi necesidad".
dowik
@dowik: No creo que tenga nada que ver con un reinicio elegante. Lo más probable es que haya tenido un reinicio que coincidió con el recolector de basura de las sesiones de PHP. Inicie sesión nuevamente e intente un reinicio regular inmediatamente después. A menos que esté almacenando sesiones en memoria (MM), la sesión se guardará.
Lèse majesté
1

Hecho posible usando el argumento correcto con Apache:

apache2ctl -k graceful

Apache se reiniciará sin perder las sesiones actuales.

dowik
fuente
2
El reinicio correcto solo pospone el apagado hasta que se terminen las conexiones actuales. No cambia el comportamiento de reinicio.
Lèse majesté