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