Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [file di testo con utenti connessi]

    Salve ragazzi,

    tramite file di testo vorrei tenere traccia nel mio forum degli utenti connessi istantaneamente.

    Per leggere e scrivere su file non ci sono problemi. Appena un utente accede al forum viene scritto il suo nome in coda all'interno del file.
    Il problema sorge quando un utente abbandona il forum.
    Se l'utente fa un logout e "uccide" la propria sessione va tutto bene perchè esegue lo script di cancellazione della sessione e lo script di cancellazione della sua username dal file di testo contenente gli utenti connessi.

    Ma se l'utente non esegue il logout e chiude forzatamente la pagina web del forum sebbene la sessione venga cancellata automaticamente il suo user rimane cmq nel file di testo perchè non viene eseguito lo script di cancellazione.

    Io non so come si può risolvere.
    Può essere anche che l'utilizzo del file text è inopportuno, ma pure utilizzando un campo nel db non risolverei il problema.

    In questo forum come funziona?

    Grazie

  2. #2

    Re: [file di testo con utenti connessi]

    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
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  3. #3
    Preso da una mia piccola creasione:
    Codice PHP:
    <?
    #CLASSI.PHP BY PEO © (SCRIPT_PRESENZE OPEN SOURCE) [url]http://leo91.altervista.org[/url]
    class Ospite{
        function 
    Aggiorna(){//Funzione che serve ogni volta che l'ospite fa qualcosa. Aggiorna il suo dato di vita
            
    $ip $_SERVER['REMOTE_ADDR'];
            
    $file file("logged.txt");
            foreach(
    $file as $rigo) {
                
    $ex explode("|",$rigo);
                if(
    $ex[0] == $ip) {
                    
    $w[] = "$ip|".(time()+120)."|\n";
                }else{
                    
    $w[] = $rigo;
                }
            }
            
    $ok implode("",$w);
            
    $fp fopen("logged.txt","w+");
            
    fwrite($fp,$ok);
            
    fclose($fp);
        }
        function 
    Guarda(){//Funzione di controllo che serve alla funzione seguente
            
    $ip $_SERVER['REMOTE_ADDR'];
            
    $file file("logged.txt");
            foreach(
    $file as $rigo){
                
    $ex explode("|",$rigo);
                if(
    $ex[0] == $ip) {
                    return 
    "falso";
                }
            }
        }
        function 
    Inserisci(){
            
    $ip $_SERVER['REMOTE_ADDR'];
            
    $pro $this->Guarda();
            if(
    $pro != "falso") {
                
    $fp fopen("logged.txt","a+");
                
    fwrite($fp,"$ip|".(time()+120)."|\n");//Inserisco un massimo di 120 secondi prima che l'ospite non venga più contato
                
    fclose($fp);
            }
        }
            
        function 
    Check(){//Serve a cancellare gli ospiti disconnessi(che non fanno azioni prima di 120 sec.)
            
    $file file("logged.txt");
            
    $tempo time();
            foreach(
    $file as $rigo) {
                
    $ex explode("|",$rigo);
                if(
    $ex[1] < $tempo){
                    
    $w[] = "";
                }else{
                    
    $w[] = $rigo;
                }
            }
            
    $ok implode("",$w);
            
    $fp fopen("logged.txt","w+");
            
    fwrite($fp,$ok);
            
    fclose($fp);
        }
        function 
    Mostra(){//Serve a mostrare gli utenti connessi
            
    $file file("logged.txt");
            
    $quanti count($file);
            if(
    $quanti == "") {$quanti "0";}
            echo 
    "[url='http://leo91.altervista.org']Utenti connessi: $quanti[/url]";//MOSTRA "Utenti connessi: *numutenti*"
        
    }
    }
    Questa era la pagina classi.php
    Codice PHP:
    <?
    #SCRIPT PER LE PRESENZE BY PEO ©
    include("classi.php");
    $tutto = new Ospite();
    $tutto->Aggiorna();
    $tutto->Inserisci();
    $tutto->Check();
    $tutto->Mostra();
    ?>
    Questa invece presenti.php

    Ti basti sapere che con quel codice non c'è un log-in, ma conta solamente gli ospiti on-line..Puoi opportunatamente eseguire qualche modifica per renderlo ok con il tuo forum

    Ciaooo
    PER CASO ti serve un guestbook, completamente personalizzabile?e PER CASO lo vuoi anche gratis e senza pop-up o dialer?E allora prova il nuovo NewAge GuestBook..Niente per caso, tutto perfetto

  4. #4
    Originariamente inviato da peo91919
    Ti basti sapere che con quel codice non c'è un log-in, ma conta solamente gli ospiti on-line
    $_SERVER['REMOTE_ADDR'] non è mai stato un buon metodo per contare gli utenti on-line ... perchè ? perchè se io e pippo siamo nella stessa intranet ed usciamo dalla stesso gateway tu avrai solo uno dei due.

    Meglio sfruttare una sessione o meglio ancora un id univoco su cookie
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.