2012-12-08 20 views
8

Sto lavorando ad un gioco di scacchi online basato su PHP/MySQL/Javascript. Un problema che ho riscontrato è la possibilità che un utente su un lato stia chiudendo il suo browser. C'è un modo per rilevare in modo affidabile se qualcuno è stato inattivo/ha chiuso la pagina?Un modo per controllare se qualcuno ha chiuso il browser usando Javascript/PHP?

Come ulteriore complicazione, il nostro server di scuola non supporta cron jobs -_-

+4

Risposta breve: ** NO ** Ma è ancora possibile eseguire il ping dell'utente a intervalli regolari per verificare che –

+1

tenga presente che questo fa affidamento sul fatto che l'utente ** lascia ** il ping per andare su –

+0

cosa intendi con il ping gli utenti? – user1880610

risposta

2

L'unico modo affidabile per farlo è quello di utilizzare una tecnica ping al server, come gli altri commentatori hanno suggerito. In questo modo controlli il gioco, non i browser. Il modo in cui devi "tracciare" gli utenti è sparare una chiamata AJAX ... Penso che ogni 5 secondi sia spesso abbastanza ... al server. Tutto ciò che dovrai fare è INSERIRE qualcosa in una tabella di "tracciamento" o AGGIORNA una nuova colonna nella tabella "Giochi" per tenere traccia dell'ultima volta in cui l'utente ha avuto attività sul server (ignorando le normali mosse nel gioco ... tu può fare lo stesso processo per le mosse normali e azzerare anche l'intervallo di ping, per evitare un controllo eccessivo). Quindi ogni volta che un utente fa una mossa (o qualcos'altro che richiede un'interazione con il server), dovresti fare un controllo per il tempo dell'ultima attività del server del tuo avversario - se l'avversario non ha fatto una mossa entro 7 secondi dalla ora corrente, quindi il browser dell'avversario ha smesso di comunicare (per qualsiasi motivo). Il motivo per cui dico 7 secondi è a causa di un'ulteriore elaborazione che si verifica per le comunicazioni tra server e database e qualsiasi possibile ritardo della rete. Poiché il ritardo di rete è probabilmente il collo di bottiglia, potresti voler aumentare questo valore a qualcosa come 10.

+0

Grazie per una risposta ragionevole! Non mi aspettavo tanto battibecco su SO -_- – user1880610

+0

Ora, per una domanda a parte: questa soluzione dipende dal fatto che un utente sia attivo. Ho una lobby che mostra tutti i giochi disponibili. C'è un modo in cui il server può capire se entrambi i giocatori se ne vanno, in modo che non debba più mostrare quel gioco nella mia lobby? La mancanza di cron diventa un problema qui. – user1880610

+0

Questo è il punto in cui non sono d'accordo con il tuo approccio semplicemente usando AJAX per un gioco multiplayer. Questo dovrebbe davvero essere fatto con websocket, dove non avresti bisogno di polling e cose del genere. Cronjobs non sarebbe di grande aiuto (a meno che la tua pagina di lobby non usi il polling, ma non li rende necessari) perché il server non può inviare messaggi al client. Come la soluzione del polling AJAX durante il gioco, dovresti fare qualcosa del genere nella tua lobby. La pagina della lobby dovrebbe eseguire il polling ogni 5 secondi come prima e verificare se entrambi gli utenti non hanno avuto attività negli ultimi 7 secondi – Ian

1

Non puoi con certezza esatta sapere se il cliente è chiuso. Puoi fare alcune supposizioni qualificate, ma non sarà mai affidabile.

Forse potresti trovare una soluzione in cui sei soddisfatto sapendo se una sessione client è attiva o no?

Una soluzione a bassa tecnologia sarebbe quella di salvare l'id di sessione (o una stringa identificativa univoca creata dall'utente) insieme a un timestamp. Ogni volta che il client effettua una nuova richiesta (caricamento di una nuova pagina e/o con AJAX), aggiorna il timestamp.

Dato che non si ha accesso a cronjobs, è necessario fare un altro compromesso - lasciare che gli altri visitatori ti dicano se il client è ancora attivo. Ogni volta che un visitatore carica una pagina, passa attraverso la tabella che memorizza gli ID di sessione e i timestamp e controlla se alcune sessioni sembrano più vecchie di quelle che considereresti attive.

Non è un sollievo al tuo problema esatto (dal momento che non può essere fatto) ma un compromesso low-tech.

0

si può semplicemente impostare uno script 'RECURSIVE' ajax in quella pagina e che lo script in silenzio inviare volta aggiornato al server dopo piccolo periodo di tempo. E sul server devi scrivere lo script Listener della richiesta per registrare questi dettagli. Se vedi che la richiesta di un utente viene interrotta o che non arriva per molto tempo, ha chiuso il browser.

Problemi correlati