2013-01-03 17 views
5

Possiedo un'applicazione PHP con funzionalità di chat che utilizza nodejs e socket.io. Quello che ora devo fare è registrare l'utente se l'utente è inattivo per più di 15 minuti.Socket.io verifica l'inattività a parte l'heartbeat dal client

Le sessioni sono condivise tra l'applicazione PHP e il server Nodejs. Quindi il server nodejs sa quando un utente ha effettuato l'ultimo accesso o quando la sua ultima attività è stata.

Sto pensando di inviare un comando logoff al client socket.io e sarebbe davvero facile se potessi distinguere tra l'heartbeat e un messaggio da un client.

Poiché l'applicazione PHP saprebbe solo dell'attività di un utente su una pagina di ricarica o di navigazione, l'utente potrebbe comunque chattare mentre è inattivo e l'applicazione PHP non saprà se l'utente sta chattando. Quindi il controllo dell'ultima attività di un utente dalla sessione non funzionerà.

Quindi la domanda principale è, posso identificare un client che ha inviato solo heartbeat per più di 15 minuti (nessuna emette)?

+0

L'operazione corretta non è aggiornare la sessione in base all'attività di chat e se non è stata eseguita alcuna attività per 15 minuti, scollegarsi al prossimo heartbeat? – mekwall

risposta

5

Il modo più semplice per disconnettersi in base all'attività della chat consiste nel disporre di un semplice timer che viene reimpostato ogni volta che l'utente sta chattando. Qualcosa del genere:

io.sockets.on('connection', function(socket) { 
    // ... 
    var logoffTimer; 
    socket.on('chat', function() { 
     // clear the timer on activity 
     // should also update activity timestamp in session 
     clearTimeout(logoffTimer); 
     // set a timer that will log off the user after 15 minutes 
     logoffTimer = setTimeout(function(){ 
      // add log off logic here 
      // you can also check session activity here 
      // and perhaps emit a logoff event to the client as mentioned 
      socket.emit("logoff", { reason: "Logged off due to inactivity" }); 
     }, 60 * 15); 
    }); 
}); 
+0

Sarà necessario modificarlo un po 'per renderlo applicabile a tutti i client. Nel codice precedente, l'attività di qualsiasi utente ripristinerà il 'logoffTimer'. Questo dovrebbe essere specifico per la presa di collegamento. – Broncha

+0

@Broncha Hmmm. Sei sicuro? L'evento 'connection' viene attivato per ogni client che si connette e' logoffTimer' è definito in tale ambito. – mekwall

+0

@MarcusEkwall questo è perfetto! Quasi 3 anni dopo ed è esattamente ciò di cui avevo bisogno, grazie! – Haring10

Problemi correlati