Originariamente inviato da lorenz_italy
In questo forum come funziona?
se sei loggato risulti utente registrato con un time() di riferimento che viene aggiornato ad ogni click sul forum o ad ogni refresh .... se vai via gli altri lo sapranno solo dopo un paio di minuti, credo, forse più ... poco importa.
Il succo è sfruttare un time per sapere quando l'utente ha effettuato l'ultima operazione, se al controllo successivo il time() di quell'utente - il time() precendete è superiore ai 2 minuti, per fare un esempio, quell'utente non è più un visitatore attivo del forum o della pagina.
esempio pratico, banalissimo e non perfetto, serve solo come esempio (per l'appunto
)
codice:
<?php // file UtentiConnessi.class.php
class UtentiConnessi {
var $minuti = 2; // minuti prima di contare l'utente come inattivo
var $fileutenti = ""; // file con le informazioni
var $utenti = array(); // lista utenti
// costruttore, accetta il nome file se presente e tenta di leggerlo
function UtentiConnessi($fileUtenti = 'utenti.txt') {
$fp = @file_get_contents($fileUtenti);
$this->fileutenti = &$fileUtenti;
// se lo legge, deserializza le informazioni
if($fp)
$this->utenti = unserialize($fp);
}
// metodo per agiornare lo stato di un utente
function aggiornaUtente($idUtente) {
// verifica se l'utente è stato trovato
$trovato = false;
// prende il tempo attuale
$tempo = time();
// calcola lo stato di inattività
$inattivo = time() - (60 * $this->minuti);
// cicla gli utenti, se presenti
for($a = 0, $b = count($this->utenti); $a < $b; $a++) {
// se l'id passato è lo stesso di questa chiave
if($this->utenti[$a]['id'] === $idUtente) {
// aggiorna il tempo
$this->utenti[$a]['tempo'] = $tempo;
// assegna l'utente come trovato
$trovato = true;
}
// altrimenti è un altro utente ... se il suo tempo è minore dello stato inattivo
else if($this->utenti[$a]['tempo'] < $inattivo)
// si elimina questo utente
unset($this->utenti[$a]);
}
// trovato è diverso da true
if(!$trovato)
// si inserisce il nuovo utente
array_push($this->utenti, array('id'=>$idUtente, 'tempo'=>$tempo));
// si riordina e resetta l'array qualora fosse stato cancellato un utente
sort($this->utenti);
reset($this->utenti);
// si salva la lista
$this->salvaUtenti();
}
// metodo per salvare l'utente
function salvaUtenti() {
// se riesce a scrivere il file
if(@$fp = fopen($this->fileutenti, "w")) {
// memorizza la lista serializzandola
fwrite($fp, serialize($this->utenti));
fclose($fp);
}
}
// metodo per sapere quanti utenti ci sono
function totaleUtenti() {
// var di ritorno
$utenti = array('guest' => 0, 'loggati' => 0);
for($a = 0, $b = count($this->utenti); $a < $b; $a++) {
// se la len è un md5, quindi da 32, è un guest
if(strlen($this->utenti[$a]['id']) === 32)
++$utenti['guest'];
// altrimenti è un loggato
else
++$utenti['loggati'];
}
return $utenti;
}
}
?>
... e poi nella pagina del forum ...
codice:
<?php
require 'UtentiConnessi.class.php';
// variabile stringa con l'id dell'utente
$idutente = "";
// classe
$utenti = new UtentiConnessi();
// se il cookie con l'id è presente ...
if(isset($_COOKIE['id']))
// l'id sarà quel cookie
$idutente = $_COOKIE['id'];
// altrimenti si verifica se l'utente ha tentato di loggarsi ...
else {
// ... ed in caso si assegna l'id con SHA1 di user e pass
if(isset($_POST['user'], $_POST['password']))
$idutente = sha1($_POST['user'].$_POST['password']);
// oppure si assegna un id generico in md5
else
$idutente = md5(microtime());
// comunque si setta l'id, qualora arrivasse come guest e dovesse loggarsi solo poi
setCookie('id', $idutente);
}
// si aggiorna lo stato, se non presente verrà inserito
$utenti->aggiornaUtente($idutente);
// si leggono gli utenti e si mostrano
$utenti = $utenti->totaleUtenti();
echo 'Utenti Guest: '.$utenti['guest'].'
Utenti Loggati: '.$utenti['loggati'];
?>
?>
o qualcosa di simile insomma ... questa è solo un'idea 
[edit]
in caso andrebbe controllato prima il tentativo di login poi il resto, sennò così non logga mai ... ho scritto senza testare