validar start sesiones pasar paginas manejo las funcionan entre ejemplo control como php session load-balancing cluster-computing

start - Sesiones de PHP en un clúster de equilibrio de carga: ¿cómo?



validar session php (10)

De acuerdo, entonces tengo este escenario único y excepcional de un sitio web PHP equilibrado. El problema es que no solía tener carga equilibrada. Ahora estamos empezando a tener problemas ...

Actualmente, el único problema es con las sesiones de PHP. Naturalmente, nadie pensó en este problema al principio, por lo que la configuración de la sesión de PHP se quedó en sus valores predeterminados. Por lo tanto, ambos servidores tienen su propio pequeño alijo de archivos de sesión, y ¡ay! Es el usuario que recibe la siguiente solicitud lanzada al otro servidor, porque esa no tiene la sesión que creó en la primera.

Ahora, he estado leyendo el manual de PHP sobre cómo resolver esta situación. Allí encontré la bonita función de session_set_save_handler() . (Y, casualmente, este tema en SO) Neat. Excepto que tendré que llamar a esta función en todas las páginas del sitio web. Y los desarrolladores de páginas futuras tendrían que recordar llamarlo todo el tiempo también. Se siente un poco torpe, sin mencionar que probablemente viole una docena de las mejores prácticas de codificación. Sería mucho mejor si pudiera cambiar alguna opción de configuración global y Voilà : todas las sesiones se almacenan mágicamente en un DB o en un caché de memoria o algo así.

¿Alguna idea sobre cómo hacer esto?

Agregado: Para aclarar: espero que esta sea una situación estándar con una solución estándar. FYI - Tengo un MySQL DB disponible. Seguramente debe haber algún código listo para usar que resuelva esto? Puedo, por supuesto, escribir mi propia sesión para guardar cosas y la opción auto_prepend señalada por Greg parece prometedora, pero eso sería como reinventar la rueda. :PAG Se agregó 2: el equilibrio de carga está basado en DNS. No estoy seguro de cómo funciona esto, pero creo que debería ser algo como this . Se agregó 3: OK, veo que una solución es usar la opción auto_prepend para insertar una llamada a session_set_save_handler() en cada script y escribir mi propia base de datos de la base de datos, tal vez enviando llamadas a memcached para un mejor rendimiento. Lo suficientemente justo.

¿Hay alguna forma en que yo podría evitar codificar todo esto yo mismo? ¿Como un plugin de PHP famoso y probado?

Se agregó mucho, mucho más tarde: esta es la forma en que fui al final: ¿Cómo implementar correctamente una persistencia de sesión personalizada en PHP + MySQL?

Además, simplemente incluí el controlador de sesión de forma manual en todas las páginas.


Cuando se trata del manejo de la sesión php en el Clúster de equilibrio de carga, es mejor tener sesiones fijas. Para eso pregunte a la red del centro de datos que mantiene el balanceador de carga para habilitar la sesión adhesiva. Una vez que esté habilitado, no tendrá que preocuparse por las sesiones en php end


Cuando tuvimos esta situación implementamos un código que vive en un encabezado común.

Esencialmente para cada página comprobamos si conocemos la Id de la sesión. Si no lo hacemos, verificamos si estamos en la situación descrita, comprobando si hemos almacenado los datos de sesion en el DB. De lo contrario, comenzamos una nueva sesión.

Obviamente, esto requiere que todos los datos relevantes se copien en la BD, pero si encapsula los datos de la sesión en una clase separada, entonces funciona bien.


La forma en que manejamos esto es a través de memcached. Todo lo que necesita es cambiar el php.ini similar al siguiente:

session.save_handler = memcache session.save_path = "tcp://path.to.memcached.server:11211"

Usamos AWS ElastiCache, por lo que la ruta del servidor es un dominio, pero estoy seguro de que sería similar para la memoria de memoría local también.

Este método no requiere ningún cambio en el código de la aplicación.


Lo más fácil es configurar su equilibrador de carga para que siempre envíe la misma sesión al mismo servidor.

Si aún desea usar session_set_save_handler entonces tal vez eche un vistazo a auto_prepend.


No mencionas qué tecnología estás utilizando para equilibrar la carga (software, hardware, etc.); pero en cualquier caso, la solución a su problema es emplear "sesiones adhesivas" en el equilibrador de carga.

En resumen, esto significa que cuando llega la primera solicitud de un visitante "nuevo", se les asigna un servidor específico del clúster: todas las solicitudes futuras para la duración de su sesión se dirigen a ese servidor. En la práctica, esto significa que las aplicaciones escritas para trabajar en un único servidor se pueden escalar a un entorno equilibrado con cero / pocos cambios de código.

Si está utilizando un equilibrador de hardware, como un dispositivo Radware, entonces las sesiones fijas se configuran como parte de la configuración del clúster. Los dispositivos de hardware generalmente le dan un control más detallado: como a qué servidor se asigna un nuevo usuario (pueden verificar el estado de salud, etc. y elegir el servidor más saludable / menos utilizado) y un mayor control de lo que sucede cuando un servidor falla y sale del clúster. El inconveniente de los equilibradores de hardware es el costo, pero valen la pena.

En cuanto a los balanceadores de software, todo se reduce a lo que estás usando. Para Apache existe la propiedad stickysession en mod_proxy - y muchos artículos a través de google para que esto funcione con la sesión php ( por ejemplo )

Editar: a partir de otros comentarios publicados después de la pregunta original, parece que su "equilibrio" se realiza a través de DNS Round Robin, por lo que lo anterior probablemente no se aplicará. Me abstendré de comentar más y comenzar una llama contra round robin dns.


Puede configurar PHP para manejar las sesiones en la base de datos, de modo que todos sus servidores compartan la misma información de sesión ya que todos los servidores usan la misma base de datos para eso.

Un buen tutorial para eso se puede encontrar aquí .


Puede ser demasiado tarde, pero mira esto: http://www.pureftpd.org/project/sharedance

Sharedance es un servidor de alto rendimiento para centralizar pares de clave / datos efímeros en hosts remotos, sin la sobrecarga y la complejidad de una base de datos SQL.

Fue diseñado principalmente para compartir cachés y sesiones entre un grupo de servidores web. El acceso a un servidor de sharedance es trivial a través de una simple API de PHP y es compatible con las expectativas de los manejadores de sesión PHP 4 y PHP 5.


Si está utilizando sesiones de php, podría compartir con NFS el directorio / tmp, donde creo que están almacenadas las sesiones, entre todos los servidores del clúster. De esa forma no necesitas una base de datos.

Editado: también puede usar un servicio externo como memcachedb (persistente y rápido) y almacenar la información de la sesión en el índice memcachedb e identificarlo con un hash del contenido o incluso la identificación de la sesión.


Si tiene tiempo y aún desea consultar más soluciones, eche un vistazo a http://redis4you.com/articles.php?id=01 .

Usando redis eres tolerante a fallas. Desde mi punto de vista, podría ser mejor que las soluciones de Memcache debido a esta solidez.


También podrías intentar usar Memcache como manejador de sesión