2010-12-13 14 views
8

Necesito transferir la sesión del usuario a través de los servidores. es decir. Si el usuario inició sesión en server1 y si el usuario existe en server2, entonces tengo que transferir los detalles de la sesión del usuario a server2. Para ello he utilizado la siguiente técnicaTransferencia de sesión en el servidor en PHP

De server1, redirigir al usuario http://server2/auth_from_server1.php?sessionid=12345 En servidor2 (internamente, en el código PHP de auth_from_server1.php), hacer una petición a http://server1/secret/check_session_id.php con el sessionid, 12345. en server1 en la implementación de check_session_id.php, valide el ID y devuelva OK, FAILURE, y datos relacionados con la sesión que desea pasar, como nombre de usuario, ... En el servidor2, cuando la llamada vuelve con OK, almacena los datos de la sesión transferida, y darle al usuario una cookie y una sesión para este servidor.

Pero cuando la función de devolución de llamada llama a auth_from_server1.php, el valor en la identificación de sesión es nulo. Intenté comprobar el sessionid como

if(isset($_SESSION['sessionId'])) 
echo 'true'; 
else 
echo 'false'; 

Pero $ _SESSION ['sessionId'] es nulo. En la página de inicio de sesión me he fijado el valor de ID de sesión como

$_SESSION['sessionId'] = session_id(); 

Gracias de antemano ....

+0

Duplicado de http://stackoverflow.com/questions/6490875/how-to-manage-a-single-php5-session-on-multiple-apache-servers – Capsule

Respuesta

16

No sería más fácil simplemente datos de la sesión almacenar en un directorio compartido?

También puede store it en una base de datos.

3

Cuando el servidor 2 llamadas server1/secreto/check_session_id.php tiene que enviar el identificador de sesión como server1/secreto/check_session_id.php? Sessionid = 12345 y en check_session_id.php usted tiene que llamar antes de session_id($_GET['sessionid'])session_start().

7

Sugeriría escribir un controlador de sesión PHP personalizado o usar un controlador de sesión precompilado como ShareDance. Puede almacenar información de sesión en una base de datos MySQL compartida entre las dos máquinas, un archivo SQLite, etc.

La capacidad de PHP para generar/establecer datos de sesión utilizando session_set_save_handler() es muy útil. las llamadas para obtener o establecer desde $ _SESSION funcionarán en su código de aplicación sin ninguna modificación adicional.

Más información se puede encontrar aquí: http://php.net/manual/en/function.session-set-save-handler.php

Un tutorial sobre cómo escribir manejadores de sesión personalizada (viejos pero todavía pertinentes) está aquí: http://devzone.zend.com/article/141

3

Otra posibilidad podría estar compartiendo el sistema de archivos. Dado que PHP coloca la sesión en el sistema de archivos, puede compartir el sistema de archivos (sshfs, por ejemplo) en ambos servidores.

el ajuste para cambiar el directorio de destino en el php.ini es

session.save_path 
+1

¿El archivo compartido la precisión del sistema en múltiples servidores sea lo suficientemente rápida? La mayoría de los sistemas de archivos compartidos que conozco disparan en busca de 'consistencia eventual' no consistencia inmediata –

2

pienso para almacenar un ID de un usuario en el PP es la forma más adecuada de hacerlo this.It es una manera a prueba de errores.

Saludos

2

Este problema puede salir rápidamente de la mano cuando se inicia añadiendo más y más severs al problema.Una de las mejores soluciones que he encontrado es almacenar la sesión en una base de datos y compartir esa base de datos con los servidores. Redis generalmente funciona de maravilla para esto. Aquí hay una gran guía para get started with redis

+0

Solo tenga en cuenta que almacenar la sesión en una base de datos consume mucha más CPU y puede empantanar rápidamente un servidor si tiene mucho tráfico. – Vincent

+0

En este punto, estamos hablando de más de un servidor. – Rick

Cuestiones relacionadas