2011-11-06 21 views
6

Sto costruendo un sito Web della comunità. Gli utenti effettueranno il login e il logout come al solito.Come verificare se un utente è online in un sito Web con database basati su php e mysql?

Io uso lo stato di attributo online/offline per impostare lo stato dell'utente. Ma cosa succede se un utente fa semplicemente clic sul pulsante X o disconnette in altro modo senza disconnettersi?

Ultimamente il mio computer si è arrestato in modo anomalo, quando ho aperto il sito con il mio portatile non sono riuscito ad accedere perché non autorizzo l'accesso in due punti. Vado su PHPMyAdmin e vedo il mio stato ancora online. C'è qualche soluzione per questo.

Ho provato l'ultima operazione di attivazione ma questo non funziona in caso di arresto anomalo del computer! E non c'era nulla né interattività o aggiornamento per aggiornare la tabella.

risposta

12

Non è necessario il flag online/offline, è sufficiente salvare l'ultimo tempo di attivazione. Quando si visualizza lo stato dell'utente, se l'ultima attività è inferiore a ora + 15 minuti, l'utente è online, altrimenti offline.

0

Sei sulla strada giusta: salva il tempo UNIX dell'ultima attività dell'utente nel database e, quando qualcuno accede al sito, imposta lo stato offline offline per gli utenti che non erano attivi per 15 minuti (o meno). Se l'utente ha effettuato l'accesso e il suo stato è impostato su non in linea nel database, forzarlo a disconnettersi (distruggendo la sessione).

Tuttavia, la vera domanda è: ne vale la pena? Non ho ancora visto nessun sistema di autenticazione simile.

+0

Ehi una cosa che non capisco è. I database sono in grado di fare il conteggio o vedere gli utenti last_activity senza l'interazione dell'utente? O dire se un utente non fa nulla sul database. Il database conta il tempo da solo e se vede che l'utente non è stato attivo da metà nostro ad aggiornare la tabella e impostare lo stato su offline? Questo può accadere senza l'interazione dell'utente. Se è così posso usare i database per vedere l'ultima_attività e aggiornare la tabella senza l'interazione dell'utente – aygeta

+0

No, un database stesso non può rilevare l'attività dell'utente. È necessario aggiornare il campo nella tabella utenti su ogni richiesta a una pagina del sito. Sarebbe più facile se tu avessi un front controller. Fai? –

+0

Ho un hosting condiviso. Non posso né installare un controller che farà il lavoro in background. Come lo fanno? come fanno i forum di discussione? Come altri siti fanno questo? Ci deve essere qualche cosa per fare questo. Cosa succede se un utente spegne il pc. Cosa poi ? come posso aggiornare la tabella. :( – aygeta

-1

Come per lo scenario, è possibile utilizzare la logica sottostante per verificare lo stato dell'utente:

Invece di controllare se l'utente è online o offline solo depednding sul valore della colonna della tabella, utilizzare la sessione variabile pure. per esempio si consideri il codice qui sotto:

<?php 

    $stauts_from_table_column; 

    if($stauts_from_table_column==1 && isset($_SESSION['userid'])) 
    { 
    $user_logged_in = true; 
    } 
    else 
    { 
    $user_logged_in = false; 
    }  

?> 

È possibile migliorare ulteriormente, ma si ottiene il mio punto spero.

+0

Le persone si prega di leggere la mia domanda. Come aggiornerò la tabella senza l'interazione dell'utente. Cosa succede se un utente spegne il computer ??? Non c'è interazione per aggiornare la tabella nulla di niente. E adesso ? – aygeta

+0

@aygeta Per l'aggiornamento automatico nel database, è possibile eseguire [processo CRON] (http://www.sitepoint.com/introducing-cron/) nel server che verrà eseguito ogni minuto e in base all'ultimo orario di attività di un utente aggiornerà il campo della colonna. Un altro modo senza il cron job è, la prossima volta che un utente prova ad accedere, si controlla se la SESSIONE non è impostata ed è impostata nel database. Dopo l'autenticazione, aggiornalo di conseguenza. –

3

A causa della natura del web, non è possibile sapere quando un utente si disconnette, strappa il cavo o spegne il suo computer senza dirlo gentilmente.

Si potrebbe avere uno script (AJAX) controllare ogni X minuti per vedere se il browser risponde ancora e, in caso contrario, attivare la modalità offline, ma questo richiederebbe risorse aggiuntive. Questo è il modo in cui funziona ad esempio un IRCd: ti PINGANO, tu PONG indietro. Se non lo fai, torna in timeout e ti disconnetti dal server.

HTTP è senza stato, non c'è altra soluzione integrata. Forse HTML5 e socket, ma quello sarebbe lo stesso principio di AJAX.

+0

Quindi ora non c'è niente che non posso fare. Posso solo sedermi e guardare i miei utenti arrabbiarsi :) Questo è male. Come posso implementarlo con ajax? Non è ancora questo metodo a seconda che l'utente abbia interagito con il sito. Non è questo lato javascript della codifica? Se è così, l'utente deve accedere al mio sito per fare interazione con ajax :) – aygeta

+0

Si implementa la funzione 'l'ultima volta vista meno di X minuti'. Che funzioni. Ora, per aumentare l'affidabilità della funzione, diminuire X e forzare gli utenti a interagire ogni X/2 (1 ms), usando ad esempio AJAX. – Konerak

+0

La risposta contrassegnata come corretta offre una soluzione pratica contraria alla tua affermazione – zardilior

1

È possibile eseguire una funzione su ogni richiesta di pagina che aggiorna una riga nel database con l'ID dell'utente e un timestamp calcolato per il futuro (ad esempio time()+(60*5); - cinque minuti). Poi ogni volta che un utente tenta di controllare se il primo utente è in linea, è possibile verificare sul database utilizzando un 'Pulse' controllare:

$time = time(); 
$query = mysql_query("SELECT user_id, timestamp FROM online_users WHERE user_id = '$user_id' AND timestamp > '$time'"); 

Se questa query restituisce più di 0 righe, l'utente è considerato on-line.

1

Soluzione farfetched.

Utilizzare un server node.js con socket.io. Chiedere al client di connettersi al server tramite il lato client socket.io. Il server è responsabile per l'emissione di eventi per i client e in attesa di una risposta. In caso di disconnessione o risposta tardiva, contrassegna l'utente offline.

Funzionerà e probabilmente funzionerà anche in caso di interruzioni di cavo/chiusura del browser, ma ne vale la pena?

0

Vorrei utilizzare una combinazione di sessioni di timeout che non hanno avuto attività recenti e scadenti sessioni precedenti quando viene effettuato un tentativo di accesso riuscito.

Poiché Konerak ha menzionato che HTTP è senza stato e che c'è non esiste un modo incorporato per dire se qualcuno ha lasciato il proprio sito. Si potrebbe capire con una sorta di tecnica di interrogazione basata su JavaScript, ma ciò causerebbe un sacco di spese generali che non è necessario nella maggior parte delle situazioni.

Invece dovresti tenere traccia dell'ultima volta che c'è stata un'attività da un utente e memorizzare quella volta nel tuo database o meglio ancora qualcosa come memcache. Se il tempo di attività dell'ultimo utente è più lungo di un periodo di timeout, si decide di assumere che non si trovano più sul sito.

La seconda parte invece di negare un accesso quando qualcuno tenta di accedere dopo aver lasciato il sito senza disconnettersi, consente loro di accedere e invalidare eventuali sessioni precedenti associate al proprio account.

0

wait man, penso di avere la risposta giusta perché ho affrontato lo stesso problema! prova ad usare l'evento del mouse [clic, movemouse ..] ma con un ritardo per non creare un arresto anomalo nel navigatore, utilizzerai setInterval su xx secondi o minuti dopo aver salvato la risposta dell'evento al tuo db nella colonna delle attività ma con unix time per differenziarlo più tardi al momento attuale .. è utile in realtà, l'ho usato per registrare i membri dell'acitvity per sapere cosa realmente fanno in tempo reale e ottenere anche gli utenti online/offline. ecco le funzioni js utilizzate:

var body = document.getElementById('body'); 
var url = './member-activity.php?loggedUser=<?=$memb_id?>&curl=<?=($_SERVER['QUERY_STRING'])?>'; 
if(document.addEventListener) { 
    document.addEventListener("click", _EventLogging, false); 
    document.addEventListener("mousemove", _EventLogging, false); 
}else{ 
    document.attachEvent("onclick", _EventLogging); 
} 
function _EventLogging(){ 
//call it after a delay of 
setTimeout(AjaxUrl(url), 2000); //delay of 2 sec after every move of cursor 
} 
//AjaxUrl is a js function that calls a php file to perform the activity logging via AJAX 
</script> 
<div id="id"></div> 

il div di cui sopra è per informarvi sugli errori nel codice, u rimuoverla quando il suo ok! spero che la mia risposta sia giusta per il tuo caso //[email protected]

1
CREATE TABLE `user_online` (
`session` char(100) NOT NULL default '', 
`time` int(11) NOT NULL default '0' 
) TYPE=MyISAM; 

<?php 

session_start(); 
$session=session_id(); 
$time=time(); 
$time_check=$time-600; //SET TIME 10 Minute 

$host="localhost"; // Host name 
$username=""; // Mysql username 
$password=""; // Mysql password 
$db_name="test"; // Database name 
$tbl_name="user_online"; // Table name 

// Connect to server and select databse 
mysql_connect("$host", "$username", "$password")or die("cannot connect to server"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

$sql="SELECT * FROM $tbl_name WHERE session='$session'"; 
$result=mysql_query($sql); 

$count=mysql_num_rows($result); 

if($count=="0"){ 

$sql1="INSERT INTO $tbl_name(session, time)VALUES('$session', '$time')"; 
$result1=mysql_query($sql1); 
} 

else { 
"$sql2=UPDATE $tbl_name SET time='$time' WHERE session = '$session'"; 
$result2=mysql_query($sql2); 
} 

$sql3="SELECT * FROM $tbl_name"; 
$result3=mysql_query($sql3); 

$count_user_online=mysql_num_rows($result3); 

echo "User online : $count_user_online "; 

// if over 10 minute, delete session 
$sql4="DELETE FROM $tbl_name WHERE time<$time_check"; 
$result4=mysql_query($sql4); 

// Open multiple browser page for result 


// Close connection 

mysql_close(); 
?> 
0

È possibile utilizzare questo metodo 1. Controllare lo stato di utente se si tratta di controllo in linea ultima attività se è più di 10 minuti di stato impostato su offline se è meno di 10 minuti spettacolo fino utente in linea se è off line spettacolo offline utente

  1. Quando l'utente che usa questo sito aggiorna l'ultima attività in ogni "x" min con ajax
  2. Quando l'utente fa clic su logout imposta lo stato su off line. Questa potrebbe essere la tua struttura di database.

enter image description here

Problemi correlati