2010-08-13 21 views
5

Todos,PHP Sesiones para manejar múltiples servidores

Tengo una aplicación web PHP5 escrita con Zend Framework y MVC. Esta aplicación está instalada en 2 servidores con la misma configuración. Server X tiene php5/MySql/Apache y Server Y también tienen lo mismo. No tenemos un servidor de base de datos común entre ambos servidores.

Mi aplicación funciona cuando se accede de forma individual a través de https en el Servidor X y el Servidor Y. Pero cuando activamos el equilibrio de carga y tenemos ambos servidores activos, las sesiones se pierden.

¿Cómo puedo asegurarme de que mis sesiones persistan en todos los servidores? ¿Debo mantener mi db en un tercer servidor y escribirle sesiones? Si es así, ¿cuál es la forma más fácil y segura de hacerlo?

Gracias

Respuesta

7

memcached es una forma popular para resolver este problema. Solo necesita ponerlo en funcionamiento (fácil) y actualizar su archivo php.ini para indicarle que use memcached como el almacenamiento de la sesión.

En php.ini deberá modificar:

session.save_handler = memcache 
session.save_path = "" 

Para la idea general: PHP Sessions in Memcached.

Hay una serie de tutoriales sobre la configuración del controlador de sesión Zend para trabajar con memcached. Elige tu opción.

0

¿Debo mantener mi db en un tercer servidor y escribirle sesiones?

Sí, una forma de manejarlo es tener una tercera máquina ejecutando la base de datos que ambos servidores web usan para la aplicación. Lo hice para varios proyectos en el pasado y funcionó bien. La pregunta con ese enfoque es ... es el cuello de botella en los servidores web o la base de datos. Si está en la base de datos, no verá mucha mejoría al combinar el equilibrio de carga de los servidores web en la mezcla. Puede que necesite pensar en esquemas de duplicación para la base de datos.

+0

¿Puede proporcionar un ejemplo para almacenar sesiones en DB de su trabajo anterior? – Jake

+0

Uso una clase local que maneja las sesiones de forma manual (al enviar los encabezados de las cookies manualmente, en lugar de dejar que PHP lo haga), así que no sé cuánta ayuda sería para usted. Si desea utilizar el manejo de sesiones de PHP, revise las funciones de manejo de sesión en los documentos php. Desea asignar una session_set_save_handler() que escribe los datos de la sesión en una tabla de base de datos. Y luego una función de lectura correspondiente. Ojalá tuviera acceso a mi código anterior que utilizaba el manejo de la sesión de php para poder enviarlos, pero, por desgracia, ya no. – GrandmasterB

+0

Aquí hay algo parecido a lo que solía hacer ... esto puede estar fechado, no lo sé, ya que hace tiempo que no uso el manejo de la sesión de PHP. http: //www.tuxradar.com/practicalphp/10/3/7 ¡Solo asegúrate de poner un índice en la identificación de la sesión o puede ser lento! – GrandmasterB

0

Otra opción es utilizar la función de sesiones adhesivas en su equilibrador de carga. Lo que esto hará es mantener a los usuarios en ciertos servidores. Entonces, cuando el usuario 1 ingrese al sitio, se dirigirán al servidor X. Todas las solicitudes posteriores también se dirigirán al servidor X. Esto le permite no preocuparse por las sesiones persistentes entre servidores, ya que cada usuario continuará siendo dirigido al servidor. servidor en el que tienen su sesión.

El único inconveniente de esto es que cuando saca un servidor web de la agrupación, la mitad de los usuarios con una sesión se desconectarán. Por lo tanto, la efectividad de esta solución depende de la frecuencia con la que saque servidores de la agrupación.