2010-12-13 16 views
8

Ho bisogno di trasferire la sessione utente tra i server. vale a dire. Se l'utente ha effettuato l'accesso a server1 e se l'utente esiste nel server2, devo trasferire i dettagli della sessione utente a server2. Per questo ho utilizzato la seguente tecnicaTrasferimento sessione su server in PHP

Da server1, reindirizzare utente a http://server2/auth_from_server1.php?sessionid=12345 On server2 (internamente, nel codice PHP di auth_from_server1.php), fare una richiesta di http://server1/secret/check_session_id.php con il sessionid, 12345. su Server1, in l'implementazione di check_session_id.php, convalida l'ID e restituisce OK, FAILURE e i dati relativi alla sessione che vuoi passare, come nome utente, ... Sul server2, quando la chiamata ritorna con OK, memorizza i dati della sessione trasferita, e dare all'utente un cookie e una sessione per questo server.

Ma quando la funzione di richiamata chiama auth_from_server1.php il valore in id di sessione è nullo. Ho provato a verificare il sessionid come

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

Ma $ _SESSION ['sessionId'] è nullo. Nella pagina di login sto impostando il valore per id di sessione come

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

Grazie in anticipo ....

+0

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

risposta

16

Non sarebbe più facile solo memorizzare i dati di sessione in una directory condivisa?

In alternativa è possibile store it in un database.

3

Quando il server 2 chiamate server1/secret/check_session_id.php si deve presentare l'ID di sessione come server1/secret/check_session_id.php? Sessionid = 12345 e in check_session_id.php dovete chiamare session_id($_GET['sessionid']) prima session_start().

7

Suggerirei di scrivere un gestore di sessione PHP personalizzato o utilizzare un gestore di sessioni precostruito come ShareDance. È possibile memorizzare le informazioni di sessione in un database MySQL condiviso tra le due macchine, un file SQLite, ecc.

Ci sono molti vantaggi nell'usare la capacità integrata di PHP di ottenere/impostare i dati di sessione utilizzando session_set_save_handler() e cioè che tutti le chiamate per ottenere o impostare da $ _SESSION funzioneranno nel codice dell'applicazione senza ulteriori modifiche.

Maggiori informazioni possono essere trovate qui: http://php.net/manual/en/function.session-set-save-handler.php

Un tutorial sulla scrittura gestori di sessione personalizzata (vecchio ma ancora rilevanti) è qui: http://devzone.zend.com/article/141

3

Un'altra possibilità potrebbe essere la condivisione del file system. Poiché PHP inserisce la sessione nel filesystem, è possibile condividere il filesystem (sshfs per esempio) su entrambi i server.

l'impostazione per cambiare la directory di destinazione in php.ini è

session.save_path 
+1

Il file condiviso la precisione del sistema su più server è abbastanza veloce? La maggior parte dei file system condivisi che conosco sparano per "coerenza finale" non consistenza immediata –

2

Penso di memorizzare un ID di un utente nel DB è il modo più appropriato per fare this.It è un modo a prova di errore.

Acclamazioni

2

Questo problema può rapidamente uscire mano quando si inizia ad aggiungere sempre più recide al problema.Una delle migliori soluzioni che ho trovato è quella di memorizzare la sessione su un database e condividere quel database con i server. In genere, Redis funziona alla grande per questo. Ecco un'eccellente guida a get started with redis

+0

Ricorda che l'archiviazione della sessione in un database richiede molta più CPU e può rapidamente impantanarsi su un server se hai molto traffico. – Vincent

+0

A questo punto, stiamo parlando di più di un server. – Rick