2009-05-20 8 views
8

Dopo che l'utente ha effettuato correttamente l'accesso, memorizzo login = true nel database. Ma come faccio a verificare se l'utente si è disconnesso chiudendo il browser senza fare clic sul pulsante di disconnessione? Inoltre, come reindirizzare l'utente che è rimasto inattivo per 10 minuti alla pagina di accesso?Come rilevare se un utente si è disconnesso, in php?

Sto usando php e mysql. Qualsiasi aiuto sarebbe apprezzato.

MODIFICA: Scusa se la mia domanda non è chiara. Ho usato la sessione per memorizzare se sono loggati o meno. Ma ora voglio memorizzare le informazioni nel database, in modo che possa visualizzare il loro stato su altre pagine. Diciamo che user1 ha 3 amici. Quando visualizzi tutti i suoi amici, user1 vuole sapere se i suoi amici sono online o offline. Questo è quello che voglio. Qualche consiglio?

+0

possibile duplicato del [rimuovere le informazioni dalla tabella di MySQL quando l'utente chiude il suo browser] (http://stackoverflow.com/questions/2195581/remove-information-from-mysql -table-when-user-close-his-browser) – Quentin

risposta

0

Sarebbe meglio per memorizzare login = true in una variabile di sessione per controllare wheter o meno l'utente è collegato a questo risolverebbe la maggior parte dei vostri problemi;.)

0

Normalmente si dovrebbe mettere tali informazioni in sessioni.

$_SESSION['user'] = "A user name"; 

Poi, quando si vuole fare il logout:

session_destroy(); 

Alcuni più informazioni sessioni here e tutorial.

+0

lo so. Ma se l'utente chiude il browser? Il mio database rimane lo stato vero vero? Voglio mostrare se l'utente è online o offline. –

+0

Lo stato dovrebbe essere un datetime quindi ogni volta che l'utente fa qualcosa è possibile aggiornare questo campo.Se l'utente è stato attivo nell'ultima mezz'ora, potresti dire che ha effettuato l'accesso. O qualcosa di simile. – MrHus

0

Perché non utilizzare la sessione oi cookie per questo invece di inserirlo nel database. È possibile impostare i cookie utilizzando la funzione setcookie() oppure è possibile rendere una sessione affidabile e memorizzare il valore in esso.

13

2017 edit: In questi giorni, la cosa migliore è usare WebSockets per monitorare la presenza di una pagina/sito.


Non si può rilevare quando un utente chiude il browser o naviga dal tuo sito con PHP, e le tecniche di JavaScript così facendo sono così lontano da garantita da essere inutile.

Invece, la soluzione migliore è probabilmente quella di memorizzare l'ultima attività di ciascun utente.

  • Creare una colonna nella tabella utente lungo le righe di "last_activity".
  • Ogni volta che un utente carica una pagina, aggiorna la sua last_attività all'ora corrente.
  • Per ottenere un elenco di chi è online, basta interrogare il database per gli utenti con valori last_activity più recenti di 10/20/qualsiasi minuto fa.
+1

Ho usato il metodo che hai descritto per un progetto una volta, e funziona benissimo. puoi anche usare le funzioni di data e ora di mysql, come timediff() e (time_to_sec (timediff (now(), last_activity))) per mostrare il periodo (ultima attività: 15 minuti fa). – stefs

+0

Questo sembra, renderà il database molto occupato se ogni pagina visitata deve aggiornare il database. c'è un modo leggero come suggerito da Gumbo? Non sono molto soddisfatto del suo commento, non lo capisco molto ... –

+0

Se il tuo sito è così occupato che una query aggiuntiva per pagina blocca il tuo sistema, un "chi è online?" la pagina sarà così grande da essere inutile comunque. Il metodo di sessione di Gumbo non funzionerà per un "chi è online?" pagina. – ceejayoz

1

Se si sta tentando di rintracciare gli utenti che sono "in linea", si potrebbe prendere in considerazione l'utilizzo di una sessione per il singolo utente e invece di memorizzare login = true nel db per visualizzare il proprio stato a te o ad altri, store l'ultimo tempo di attività per l'utente. Quando si apre l'elenco degli utenti online, creare la query sql per restituire gli utenti solo con 'last_activity' negli ultimi 10 minuti.

0

AFAIK non è possibile controllare quando una persona chiude la finestra del browser (o lascia la pagina per passare a un'altra), quindi è necessario controllare l'attività come suggerito in precedenza.

2

Ti stai chiedendo se è possibile rilevare se un utente ha chiuso il browser. Puoi farlo con javascript ma non ci farei affidamento (dal momento che javascript è facile da disattivare) Ma non puoi farlo con PHP, dato che PHP viene eseguito solo quando richiedi una pagina. Non quando la pagina è aperta.

Per essere sicuri, è necessario tenere traccia dell'ultima attività dell'utente e se è trascorso qualche minuto (5/10), si supponga che l'utente non ci sia più. Se fa di nuovo qualcosa però (dopo 6 minuti per esempio), allora è tornato online.

8

Memorizza il timestamp di ciascuna acidità dell'utente. Quando quel momento è più di 10 minuti fa, fai il logout.

In PHP, si potrebbe fare qualcosa di simile:

session_start(); 
if (!isset($_SESSION['LAST_ACTIVITY'])) { 
    // initiate value 
    $_SESSION['LAST_ACTIVITY'] = time(); 
} 
if (time() - $_SESSION['LAST_ACTIVITY'] > 3600) { 
    // last activity is more than 10 minutes ago 
    session_destroy(); 
} else { 
    // update last activity timestamp 
    $_SESSION['LAST_ACTIVITY'] = time(); 
} 

Lo stesso può essere fatto sulla base di dati, invece. Ci si potrebbe anche ottenere un elenco di utenti che sono "attualmente" online.

+1

è applicabile a più di 1 utente? Se voglio elencare 10 utenti, voglio controllare che 10 utenti siano online, come si fa? –

+0

opps, sory .. lo so, se l'ultima attività più di 10 minuti, reindirizzerò a una pagina php, dire al mio database che questo utente è stato disconnesso? è questo che vuoi dire? –

+0

I commenti descrivono il significato di ciascun ramo. Quindi "l'ultima attività è più di 10 minuti fa" significa che questo ramo viene inserito se l'ultima attività è più di 10 minuti fa, quindi è rimasto inattivo per più di 10 minuti. Ciò che questo significa per la tua logica applicativa è la tua attività. – Gumbo

0

Questa è un'estensione di quello che 'ceejayoz' ha detto prima.

Lascia che gli utenti eseguano periodicamente il ping del servizio e comunichino che sono ancora connessi. Memorizza l'ultima volta ping nella sessione. Se l'ultima sessione di ping è maggiore di una determinata ora, eseguire nuovamente il ping per indicare che l'utilizzo è ancora attivo.

Memorizza l'ora in cui hai ricevuto il ping nel database. Se l'ultimo ping ricevuto è> la soglia keeplive, allora considera che l'utente ha lasciato il sito.

Quanto segue è un codice di esempio non testato per iniziare. È possibile utilizzare "PING__FREQUENCY" per controllare la frequenza con cui l'attività dell'utente aggiornerà la colonna last_activity.

define(PING_FREQUENCY,300); //5 mins 
if (($_SESSION['lastPingTime'] + PING_FREQUENCE) > time()) { 
    stillLoggedIn(); //execute a function to tell that the user is still logged in 
} 

function stillLoggedIn() { 
    //Do SQL update to mark the last activity time for the user 
} 
+0

: puoi DDoS il tuo sito in questo modo, se hai un numero elevato di utenti – Piskvor

+0

True. Questo non è qualcosa che vorrei fare btw. Ma offerto solo come soluzione al problema descritto nel post originale. – StackKrish

0

IMHO il modo migliore è quello di memorizzare ultima attività timestamp nel DB ad ogni aggiornamento dei record utente. Dopo la disconnessione o il timeout (mantenere i timeout con cronjob) basta impostarlo su valore zero e usarlo come flag.

$user = new User($user_id); 
$user->logged_in = (bool)($last_activity > 0); 

A volte è necessario dire smth. come "visto l'ultima volta su ...", quindi lascia l'ultima attività e aggiungi semplicemente un flag booleano (tinyint) loggato alla tabella degli utenti.

0

Puoi farlo con una combinazione di modi, 2 al massimo credo, con quello che dà fastidio all'ultima attività, lo combini usando jQuery per verificare l'inattività, cioè nessun evento del mouse o della tastiera per qualche tempo , diciamo circa 10 a 20 minuti, quindi una volta confermato il tempo di inattività, si effettua una chiamata ajax a un file php che aggiornerà la tabella del database mostrando all'utente offline.

Si può iniziare con:

<script type="text/javascript"> 
idleTime = 0; 
$(document).ready(function() { 
//Increment the idle time counter every minute. 
var idleInterval = setInterval(timerIncrement, 60000); // 1 minute 

//Zero the idle timer on mouse movement. 
$(this).mousemove(function (e) { 
    idleTime = 0; 
}); 
$(this).keypress(function (e) { 
    idleTime = 0; 
}); 
}); 

function timerIncrement() { 
idleTime = idleTime + 1; 
if (idleTime > 19) { // 20 minutes 
    $.ajax({ 
    url: 'update_user.php', 
    type: 'POST', 
    datatype: 'json', 
    data: someData 
    }); 
} 
} 
</script>