2008-11-01 5 views

Respuesta

4

La respuesta a su pregunta específica, cuál sería el problema, radica en el hecho de que PHP almacena por defecto sus sesiones en archivos en el sistema de archivos. Para un servidor web único que sirve solicitudes, esto no es un problema porque los datos de su sesión siempre estarán disponibles. Pero, ¿y si tuviera dos servidores web de carga equilibrada que atendieran las solicitudes?

Imagínese presionar el primer servidor web con una solicitud, que crea su archivo de sesión en su sistema de archivos. Luego, su próxima solicitud llega al segundo servidor web. El segundo servidor web, por supuesto, no verá el archivo de sesión. Para el usuario, puede iniciar sesión en un sitio web y luego cerrar la sesión de repente.

Esto no es un problema específico de PHP, y es muy común. La solución es almacenar datos de sesión en algún área común. El método más común para esto es almacenar datos de sesión en una base de datos accesible para todos los servidores web, o en algún servidor de memoria caché compartida como memcached.

+0

Como @azkotoki menciona a continuación, una partición compartida como una montura NFS respaldada por NAS también funciona bien. Lo bueno de esto es que no implica cambios de código. Simplemente enlace simbólico el directorio de la sesión local a NFS. – gerard

+0

, pero ¿y si los dominios están en centros de datos separados? – Dannyboy

4

Las sesiones persistentes en varios servidores (también conocidas como clustering de sesiones) son un problema común para escalar aplicaciones web, y no son específicas de PHP. PHP ofrece varias soluciones para manejarlo, como el Zend Platform (servidor de aplicaciones comerciales) y el Msession (extensión).

10

También es posible usar una sesión de Reserva de encargo manejador:

http://www.php.net/manual/en/function.session-set-save-handler.php

yo no he probado, pero con ella se defina su propio guardar/leer funciones, por lo que se puede implementar una base de datos o un backend nfs compartido sin la necesidad de instalar ninguna extensión.

También Msession, que fue sugerido por @Eran Galperin, se ve muy interesante como una alternativa a la que mencioné antes.

+0

Esta es una gran respuesta, y me va a utilizar este enfoque. ¡Gracias! – woody121

0

Bastante una pregunta vaga, pero diría que el problema es más grande que el mencionado en las respuestas. Claro que puede anular cómo cargar y guardar las cookies, pero también tiene un costo. Por ejemplo, tendrá que considerar los siguientes escenarios/preguntas:

  • Si está colocando las cookies en otro host, ¿cómo afectará esto la velocidad de sus cookies? Eso obviamente depende de cuántas escrituras/lecturas hagas.
  • ¿Está haciendo esto para aumentar la velocidad o tener una conmutación por error? La respuesta definitivamente dará lugar a soluciones diferentes:
    • En caso de que esté haciendo esto para la conmutación por error, ¿cómo manejará si su servidor web no puede acceder a su tienda de sesión porque el enlace de red se cae? ¿Qué pasa si tu tienda de sesión cae? Deberá resolver esto utilizando algún tipo de replicación maestro-maestra, posiblemente ejecutando ese almacén de sesión distribuido en la misma máquina que el servidor web para una alta disponibilidad adicional (si todas las sesiones pueden caber en la memoria). Eche un vistazo a Riak o similar para la replicación maestro-maestro.
    • En caso de que simplemente esté haciendo esto para la velocidad, usaría apache, nginx o (más rápido) haproxy para simplemente equilibrar la carga según la dirección IP del cliente. De esta forma, no tiene que preocuparse por configurar una tienda de sesión distribuida. Claro, si una de sus instancias de PHP falla, sus usuarios perderán sus cookies, pero tal vez eso no sea un problema. Tu decides.
Cuestiones relacionadas