C'è un modo per eseguire una funzione quando le sessioni vengono distrutte dal timeout o dalla chiusura del browser?
Sì, ma potrebbe non funzionare come si immagina. È possibile definire il proprio gestore di sessione personalizzato utilizzando session_set_save_handler
e parte della definizione fornisce le funzioni di callback destroy
e gc
. Questi due vengono richiamati quando una sessione viene distrutta in modo esplicito e quando viene distrutta a causa della sua scadenza, quindi fanno esattamente quello che chiedi.
Tuttavia, la scadenza della sessione a causa del timeout è non con precisione di clockwork; potrebbe essere un bel po 'di tempo prima che una sessione scaduta sia in realtà "raccolta dei rifiuti". Inoltre, la procedura di garbage collection innesca probabilistically così nella teoria c'è la possibilità che le sessioni scadute corrispondano a mai a.
È sensato? Sono un paio di centinaia di query SQL simultanee che vanno a per essere un problema per un server condiviso ed è l'idea di usare $ _SESSION come buffer per alleviare alcuni di questi.
Io davvero non farei questo per diversi motivi:
- ottimizzazione prematura (prima di misurare, non dare per scontato che sarà "migliore").
- La sessione potrebbe non essere mai raccolta dati inutili; anche se ciò non accade, non si controlla quando vengono raccolti i dati. Questo potrebbe essere un problema.
- C'è una possibilità di perdere tutto ciò che una sessione contiene (ad esempio il riavvio del server), che include il progresso del giocatore. Ai giocatori non piace perdere i progressi.
- Le sessioni simultanee per lo stesso utente sarebbero impossibili (i cui "dati salvati" vince e rimane persistente nel database?).
E le alternative?
Bene, dato che stiamo parlando dell'hosting condiviso di el cheapo, non si ha il controllo del server, quindi tutto ciò che comporta estensioni PHP (ad esempio memcached) è condizionale. Anche il caching sul lato database non ha intenzione di volare. Inoltre, il carico sul tuo server sarà influenzato da variabili esterne al tuo controllo, quindi non puoi davvero fare alcuna pianificazione della capacità.
In ogni caso, inizierei assicurandomi che il database stesso sia strutturato in modo ottimale e che il codice sia scritto in modo da minimizzare il carico sul database (prestazioni gratuite semplicemente digitando materiale in un editor).
Successivamente, è possibile introdurre la cache di sola lettura : in genere ci sono molte cose che è necessario visualizzare ma non si intende modificare. Per i dati che "quasi mai" vengono aggiornati, una cache di sessione che si annulla ogni volta che è necessario potrebbe essere un miglioramento facile e molto efficace (si possono anche avere falsi positivi per quanto riguarda l'invalidazione, purché non siano troppi nel grande schema di cose).
Infine, è possibile aggiungere il caching per richiesta (in variabili) se si è preoccupati di estrarre gli stessi dati dal database due volte durante una singola richiesta.
memcache è sicuramente la strada da percorrere, itll alleggerire i mocassini più di quanto sessione di stoccaggio/scrittura. – gorelative
Non ottimizzare finché non si è certi di avere un problema. Nel momento in cui si ha abbastanza carico che questo è un problema, il tuo host ti ha fatto spostare comunque sul tuo server dedicato. –
OK. Scarto quell'idea allora. Grazie gente! – Ryan