Catturare il Timeout
Catturare il Timeout postato il 10/04/2013 01:05:04 nel forum programmazione, open source e hosting
Ciao ragazzi, non riesco a capire una cosa. Come si cattuare il Timeout di una sessione???
Esempio faccio la login al GDR, non faccio logout ma clicco semplicemente sulla X del browser. A quel punto dovrei comunque togliere l'utente dalla lista degli online. Ho già cercato nel forum, ho trovato anche la soluzione di una query ogni tot secondi, oppure fare una query ad ogni pagina, ma non esiste un Listener per esempio?
Grazie mille
10/04/2013 03:05:52 e modificato da ilgrandeinverno il 10/04/2013 03:07:40
noi facciamo aggiornare un recors nella tabella dei presenti contenente il timestamp (preso con funzione time() di php) dell'ultimo aggiornamento ricevuto dall'utente collegato. L'update viene innescato in genere da un frame autoaggiornante, dall'invio di azioni, ecc, ma puoi anche ricorrere a soluzioni più eleganti con l'uso di ajax se il reload di un frame (o se non hai frame) sembra troppo tecnologicamente vetusto.
Allo stesso tempo una query cancella dall'elenco dei presenti tutti quelli che non hanno update negli ultimi 5 minuti.
Es:
$LIMITE=time()-300;
$upd = "DELETE FROM TABELLA_PRESENTI WHERE ULTIMOUPDATE < $LIMITE";
mysql_query($upd) or die('Hai sbagliato qualcosa, fesso: '.mysql_error());
300 = 5 minuti
TABELLA_PRESENTI = nome della tabella in cui salvi i pg presenti
ULTIMOUPDATE = nome del campo in cui salvi gli aggiornamenti dei timestamp in risposta alle attività degli utenti.
ps: credo tu possa anche intercettare con JS l'evento di chiusura della finestra cliccando sulla X ed eventualmente rimandare prima alla pagina di logout.
10/04/2013 11:08:14
L'evento che ti serve è il beforeunload di javascript, questo intercetta la chiusura della scheda-finestra.
10/04/2013 11:17:45
l'evento beforeunload non credo che possa gestire tutti i casi. L'utente potrebbe anche non cliccare sulla X ma spegnere direttamente il PC.
Per quanto riguarda la soluzione di ilgrandeinverno potrebbe andare bene. Praticamente l'UPDATE viene fatto su tutti gli utenti giusto??? Quindi immagiamo che io e un altro utente siamo connessi. Quest'ultimo esce dalla LAND senza aver fatto logout etc etc, sarò io o un altro utente ancora connesso che attraverso una funzione ajax che fa pooling al server va in update giusto???
10/04/2013 11:47:33
salvuzzo87 ha scritto: sarò io o un altro utente ancora connesso che attraverso una funzione ajax che fa pooling al server va in update giusto???
Precisamente. Io ne avevo progettata una per cui ogni utente dopo TOT secondi richiamasse lo script di controllo, ma dati i notevoli costi in memoria nel dover lanciare sta query praticamente N volte al minuto, dove N è il numero degli online, ho poi modificato tenendo sul db un record con l'ultimo orario di aggiornamento, in modo che sì.. ogni utente richiama questa pagina una volta ogni X secondi, ma lo script entra in funzione soltanto ogni 10 minuti.
Fin quando c'è anche una sola persona online tutto continua a funzionare correttamente, ma anche sloggasse semplicemente resterebbe 1 solo user online che verrebbe aggiornato immediatamente con l'ingresso di qualcun'altro
10/04/2013 12:31:16
ho poi modificato tenendo sul db un record con l'ultimo orario di aggiornamento, in modo che sì.. ogni utente richiama questa pagina una volta ogni X secondi, ma lo script entra in funzione soltanto ogni 10 minuti.
Hmm scusami ma non ho capito questa parte. Lo script entra in funzione soltanto ogni 10 minuti?
10/04/2013 12:56:17
salvuzzo87 ha scritto: Hmm scusami ma non ho capito questa parte. Lo script entra in funzione soltanto ogni 10 minuti?
Ogni utente chiama ad intervalli di 60 secondi uno stesso script, che lavora grossomodo così:
~INIZIO SCRIPT
Controllo sul db l'orario dell'ultimo aggiornamento (è un solo dato per tutto il gioco, non uno ad utente).
L'aggiornamento risale a più di 10 minuti fa?
NO: Non faccio nulla
SI: aggiorno quell'orario al corrente e lancio la query per mandare offline gli inattivi
~FINE SCRIPT
In sostanza viene invocato decine di volte al minuto, ma lavora solo una ogni 10
10/04/2013 13:09:48
~INIZIO SCRIPT
Controllo sul db l'orario dell'ultimo aggiornamento (è un solo dato per tutto il gioco, non uno ad utente).
L'aggiornamento risale a più di 10 minuti fa?
NO: Non faccio nulla
SI: aggiorno quell'orario al corrente e lancio la query per mandare offline gli inattivi
~FINE SCRIPT
Scusa se rompo, ma voglio capire bene tutto :). Allora se ho capito funziona così. Ogni tot secondi viene fatta soltanto una select per vedere se è avvenuto un aggiornamento (superati i 30 minuti), se ciò avvenisse allora vado in update sugli utenti che la loro data di attività è inferiore ai 30 minuti.
In questo caso è vero che la query viene fatta ogni secondo ma è una sola select invece di un update giusto?
10/04/2013 14:17:40
Se ho capito bene che hai capito bene sì, anche se l'aggiornamento di tutti gli user è ogni 10 minuti e non ogni 30.
Se poi vuoi altre info posso pure passarti lo script in pvt, così vedi direttamente come lavora
10/04/2013 16:45:55
Si si grazie ^^ mi faresti un grosso favore
10/04/2013 17:16:47
salvuzzo87 ha scritto: Praticamente l'UPDATE viene fatto su tutti gli utenti giusto???
Solo la delete, perchè l'unica cosa che ti interessa é che vengano rimossi tutti quelli che non hanno fatto alcuna attività negli ultimi X minuti (quel 300 che é X*60 secondi).
Ovviamente le singole update innescate dai giocatori devono riguardare soltanto il loro singolo record quindi la clausola WHERE deve contenere il riferimento all'id/nome del loro personaggio/account o comunque alla chiave unica con cui identifichi i collegati.
Naturalmente questo se hai una tabella a parte per i presenti, se fai tutto con la tabella dei pg la delete non ti serve, ti basta mostrare nell'elenco degli online solo quelli che hanno avuto un update più recente degli ultimi X minuti.
Quindi immagiamo che io e un altro utente siamo connessi. Quest'ultimo esce dalla LAND senza aver fatto logout etc etc, sarò io o un altro utente ancora connesso che attraverso una funzione ajax che fa pooling al server va in update giusto???
Sì. E tanto per sicurezza, comunque, già nella select che estrae gli online puoi vincolare l'estrazione solo dei record aggiornati più recentemente, escludendo eventuali record di utenti non ancora cancellati ma probabilmente inattivi.
Discussione seguita da
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
RAID Shadow Legends ↗
Tibia ↗
Sea of Conquest ↗
Crossout ↗
World of Tanks ↗
Foundation Galactic Frontier ↗
State of Survival ↗