Domanda

Sto apportando modifiche a un sito basato sui membri il cui proprietario desidera essere in grado di tenere traccia del tempo trascorso sul sito (login / logout) per tutti gli utenti in un back-end DB. Il login è facile; c'è un punto di ingresso (il modulo di login) e, di conseguenza, gli accessi possono essere lanciati nel database non appena si verificano.

I logout, tuttavia, sono un po 'più complicati, poiché a meno che l'utente non faccia clic su "logout" per comunicarci esplicitamente che stanno lasciando la soluzione diventa più pelosa (e con quale frequenza gli utenti realmente fanno clic sul logout? ). Una possibilità (solo in termini di monitoraggio del tempo totale sul sito) sarebbe quella di registrare ogni pageload nel database e associarlo all'utente che lo ha caricato; il problema è che il sito è un sito di distribuzione di video basato sull'iscrizione (non quello che stai pensando!) e la loro ultima visualizzazione di pagina sarà probabilmente un video di venti o trenta minuti. Dobbiamo anche catturare il tempo speso nell'ultima pagina, non solo il tempo in cui è stato caricato.

Ho pensato a due possibili soluzioni, nessuna delle quali è così elegante. Il primo sarebbe quello di intercettare tutti gli eventi di "scaricamento" tramite javascript e registrare una chiamata a "logout.php" (presupponendo che XMLHttpRequest o qualunque cosa non muoia non appena la pagina viene scaricata); il problema è che i collegamenti interni si registrano anche come eventi di scaricamento, quindi facendo clic su qualsiasi collegamento si disconnetterebbe l'utente (è possibile controllare un flag nel gestore 'Unload' e avere tutti i collegamenti interni impostati quel flag - non è difficile da fare dinamicamente, ma un po 'kludgy). L'altro approccio implicherebbe l'impostazione di un intervallo per eseguire il ping del DB ogni 60 secondi circa, il che ci consente di sapere che l'utente è ancora sul sito, e quindi fare un po 'di matematica quando si estrae la cronologia dell'utente per capire la durata totale di quella sessione ; anche questo sembra un po 'hacker. Inoltre, nessuna di queste soluzioni funziona per gli utenti con JS disabilitato.

Sembra che questo problema non sia così insolito, e ci deve essere un modo migliore; esiste un approccio di buone pratiche per risolvere questo? In caso contrario, vedi un modo per migliorare una di queste soluzioni?

È stato utile?

Soluzione

Il Web non è stato creato per consentire il tracciamento accurato degli eventi di disconnessione. Non hai la garanzia di ricevere una notifica dal browser quando l'utente esce, quindi in circostanze normali la cosa migliore che puoi sperare è di intercettare l'evento di timeout della sessione e tale evento potrebbe non attivarsi fino a 20 minuti dopo che l'utente ha abbandonato la pagina .

Ora puoi migliorare un po 'questo inserendo una richiesta ajax in un timer su ogni pagina (forse una o due volte al minuto) per fornire un "battito cardiaco", ma questo ha anche alcuni avvertimenti: devi fare certo che alla fine la sessione continuerà a scadere e non sei ancora sicuro che l'utente non bloccherà queste richieste, magari disabilitando javascript.

Altri suggerimenti

Ho avuto un buon successo con l'utilizzo del timer in JavaScript per eseguire il ping del server. Nel mio caso il sito richiede JavaScript, quindi questo non è un problema. Uso anche questo meccanismo per eseguire un controllo che impedisce a un singolo account di accedere da due macchine diverse, quindi ci sono ragioni più convincenti per fare questo hack.

Una cosa da tenere a mente quando si scarica è che non si è ancora garantiti che l'evento di scarico verrà sempre generato. Avrai persone su laptop che, ad esempio, chiudono il laptop, quindi l'approccio con il timer sarà probabilmente un po 'più preciso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top