OK, quindi ho questo raro scenario unico di un sito web PHP bilanciato dal carico. Il problema è che non era bilanciato dal carico. Ora stiamo iniziando a ottenere problemi ...sessioni PHP in un cluster di bilanciamento del carico - come?
Attualmente l'unico problema è con le sessioni PHP. Naturalmente nessuno ha pensato prima a questo problema, quindi la configurazione della sessione PHP è stata lasciata ai suoi valori predefiniti. Quindi entrambi i server hanno il loro piccolo archivio di file di sessione, e guai è l'utente che ottiene la successiva richiesta lanciata all'altro server, perché non ha la sessione che ha creato sul primo.
Ora, ho letto il manuale PHP su come risolvere questa situazione. Lì ho trovato la bella funzione di session_set_save_handler()
. (E, per coincidenza, this topic su SO) Neat. Tranne che dovrò chiamare questa funzione in tutte le pagine del sito. E gli sviluppatori di pagine future dovrebbero ricordarsi di chiamarlo tutto il tempo pure. Sembra un po 'goffo, per non parlare probabilmente della violazione di una dozzina di migliori pratiche di codifica. Sarebbe molto più bello se potessi semplicemente capovolgere alcune opzioni di configurazione globale e Voilà - tutte le sessioni vengono memorizzate magicamente in un DB o in una memoria cache o qualcosa del genere.
Qualche idea su come fare questo?
Aggiunto: Per chiarire: mi aspetto che questa sia una situazione standard con una soluzione standard. A proposito, ho un DB MySQL disponibile. Sicuramente ci deve essere un codice pronto all'uso che risolva questo problema? Posso, naturalmente, scrivere la mia sessione di salvataggio e l'opzione
auto_prepend
evidenziata da
Greg sembra promettente, ma sarebbe come reinventare la ruota. : P
Aggiunto 2: Il bilanciamento del carico è basato su DNS. Non sono sicuro di come funzioni, ma suppongo che dovrebbe essere qualcosa come this.
Aggiunto 3: OK, vedo che una soluzione è quella di utilizzare
auto_prepend
opzione per inserire una chiamata a
session_set_save_handler()
in tutti gli script e scrivere il mio persister DB, forse gettando in chiamate a
memcached
per migliorare le prestazioni. Giusto.
C'è anche un modo per evitare di scrivere tutto questo da solo? Come alcuni plugin PHP famosi e ben collaudati?
aggiunto molto, molto più tardi: Questo è il modo in cui sono andato alla fine: How to properly implement a custom session persister in PHP + MySQL?
Inoltre, ho inserito semplicemente il gestore di sessione manualmente in tutte le pagine.
Questo non è il modo corretto. Il problema sono le sessioni PHP, dimenticando i database, stiamo parlando di PHP. Questa soluzione è solo una soluzione. – Daniel
Non sono d'accordo. Memorizzare le sessioni PHP nel database è un'ottima soluzione a questo problema. –
@MattFletcher è una soluzione scadente al problema. dovrebbe essere usata la memoria, come redis, memcached, o ramfs ecc. – r3wt