Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASSE : COMPTEUR DE VISITEURS CONNECTÉS AU SITE


Information sur la source

Catégorie :Class et Objet ( POO ) Classé sous : connecté, visiteur, fichier texte Niveau : Débutant Date de création : 04/03/2008 Date de mise à jour : 07/03/2008 12:19:33 Vu : 4 003

Note :
Aucune note

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

Description

Petite classe permettant d'afficher, sans base de données, le nombre de connectés sur son site.

N'hésitez pas à me suggérer des améliorations.
 

Source

  • <?php
  • if (!class_exists('counter'))
  • {
  • /*
  • -------------------------------------------
  • Classe permettant d'afficher le nombre de
  • connectés d'un site sans base de données.
  • ------------------------------------------
  • */
  • class counter
  • {
  • var $dir;
  • var $file;
  • var $idle;
  • var $userIp;
  • var $cache_file;
  • var $cache_time;
  • var $cache_filename;
  • /*
  • $count : Gardera en mémoire le nombre de connectés.
  • */
  • var $count = false;
  • /*
  • Constructeur
  • */
  • function counter($dir = 'howmany/', $idle = 300, $cache_time = 60, $cache_filename = 'cache.txt')
  • {
  • $dir = substr($dir, -1) == '/' ? $dir : $dir . '/';
  • if (!is_dir($dir))
  • {
  • mkdir($dir);
  • }
  • $this->dir = $dir;
  • $this->idle = $idle;
  • $this->userIp = $this->getIp();
  • $this->file = $this->dir . md5($this->userIp);
  • $this->cache_filename = $cache_filename;
  • $this->cache_file = $this->dir . $cache_filename;
  • $this->cache_time = $cache_time;
  • }
  • /*
  • update : Met à jour le fichier de l'utilisateur courant
  • */
  • function update()
  • {
  • if (!@file_exists($this->file) || !@touch($this->file))
  • {
  • fopen($this->file, 'w');
  • }
  • }
  • /*
  • garbage : Nettoie le dossier - Suppréssion des fichiers obsolètes
  • */
  • function garbage()
  • {
  • $timeCacheVerif = time() - $this->cache_time;
  • if ($h = opendir($this->dir))
  • {
  • while (false !== ($f = readdir($h)))
  • {
  • if ($f != '.' && $f != '..' && $f != $this->cache_filename)
  • {
  • $cfp = $this->dir . '/' . $f;
  • if (@filemtime($cfp) < $timeVerif)
  • {
  • @unlink($cfp);
  • }
  • }
  • }
  • }
  • }
  • /*
  • view : Affiche le nombre de connectés au site
  • */
  • function view($text = true)
  • {
  • if ($this->count !== false)
  • {
  • $nb = $this->count;
  • }
  • else
  • {
  • $nb = $this->count();
  • }
  • return $nb . ($text ? ' connecté' . ($nb>1?'s':'') : '');
  • }
  • /*
  • getIp : Renvoie l'adresse IP de l'utilisateur
  • */
  • function getIp()
  • {
  • if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  • {
  • $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  • }
  • elseif (isset($_SERVER['HTTP_CLIENT_IP']))
  • {
  • $ip = $_SERVER['HTTP_CLIENT_IP'];
  • }
  • else
  • {
  • $ip = $_SERVER['REMOTE_ADDR'];
  • }
  • return $ip;
  • }
  • /*
  • count : Retourne le nombre de connectés
  • */
  • function count()
  • {
  • //clearstatcache();
  • $ok = false;
  • $timeCacheVerif = time() - $this->cache_time;
  • if (file_exists($this->cache_file) && @filemtime($this->cache_file) > $timeCacheVerif)
  • {
  • $content = $this->read($this->cache_file);
  • $key = substr($content, 0, 32);
  • $i = substr($content, 32);
  • if ($key == md5($i))
  • {
  • $ok = true;
  • }
  • }
  • if (!$ok)
  • {
  • if (!is_dir($this->dir)) return false;
  • $timeVerif = time() - $this->idle;
  • $i = 0;
  • if ($h = opendir($this->dir))
  • {
  • while (false !== ($f = readdir($h)))
  • {
  • if ($f != '.' && $f != '..' && $f != $this->cache_filename)
  • {
  • $cfp = $this->dir . '/' . $f;
  • if (@filemtime($cfp) > $timeVerif)
  • {
  • $i++;
  • }
  • else
  • {
  • @unlink($cfp);
  • }
  • }
  • }
  • }
  • $this->write($this->cache_file, md5($i) . $i, 'w');
  • }
  • $this->count = $i;
  • return $this->count;
  • }
  • /*
  • write : Ecrit dans un fichier
  • */
  • function write($file, $content, $mode = 'a')
  • {
  • $fp = fopen($file, $mode);
  • if ($fp)
  • {
  • @flock($fp, LOCK_EX);
  • @fwrite($fp, $content, strlen($content));
  • @flock($fp, LOCK_UN);
  • @fclose($fp);
  • return true;
  • }
  • return false;
  • }
  • /*
  • read : Lit dans un fichier
  • */
  • function read($file)
  • {
  • if (!@file_exists($file)) return false;
  • $fp = @fopen($file, 'r');
  • if ($fp)
  • {
  • @flock($fp, LOCK_SH);
  • $content = @fread($fp, @filesize($file));
  • @flock($fp, LOCK_UN);
  • @fclose($fp);
  • return $content;
  • }
  • return false;
  • }
  • }
  • }
  • ?>
<?php

if (!class_exists('counter'))
{

/*

-------------------------------------------
 Classe permettant d'afficher le nombre de
 connectés d'un site sans base de données.
------------------------------------------

*/

class counter
{
	var $dir;
	
	var $file;
	
	var $idle;
		
	var $userIp;
	
	var $cache_file;
	
	var $cache_time;
	
	var $cache_filename;
	
	/*
	$count : Gardera en mémoire le nombre de connectés.
	*/
	
	var $count = false;
	
	/*
	
	Constructeur
	
	*/
	
	function counter($dir = 'howmany/', $idle = 300, $cache_time = 60, $cache_filename = 'cache.txt')
	{
		$dir = substr($dir, -1) == '/' ? $dir : $dir . '/';
		
		if (!is_dir($dir))
		{
			mkdir($dir);
		}
		
		$this->dir = $dir;
				
		$this->idle = $idle;
		
		$this->userIp = $this->getIp();
		
		$this->file = $this->dir . md5($this->userIp);
		
		$this->cache_filename = $cache_filename;
		
		$this->cache_file = $this->dir . $cache_filename;
		
		$this->cache_time = $cache_time;
	}
	
	/*
	
	update : Met à jour le fichier de l'utilisateur courant
	
	*/
	
	function update()
	{
		if (!@file_exists($this->file) || !@touch($this->file))
		{
			fopen($this->file, 'w');
		}
	}
	
	/*
	
	garbage : Nettoie le dossier - Suppréssion des fichiers obsolètes
	
	*/
	
	function garbage()
	{
		$timeCacheVerif = time() - $this->cache_time;
		
		if ($h = opendir($this->dir))
		{
			while (false !== ($f = readdir($h)))
			{
				if ($f != '.' && $f != '..' && $f != $this->cache_filename)
				{
					$cfp = $this->dir . '/' . $f;
					
					if (@filemtime($cfp) < $timeVerif)
					{
						@unlink($cfp);
					}
				}
			}
		}
	}
	
	/*
	
	view : Affiche le nombre de connectés au site
	
	*/
	
	function view($text = true)
	{
		if ($this->count !== false)
		{		
			$nb = $this->count;
		}
		else
		{			
			$nb = $this->count();
		}
		
		return $nb . ($text ? ' connecté' . ($nb>1?'s':'') : '');
	}

	/*
	
	getIp : Renvoie l'adresse IP de l'utilisateur
	
	*/
	
	function getIp()
	{
		if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
		{ 
			$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
		} 
		elseif (isset($_SERVER['HTTP_CLIENT_IP']))
		{
			$ip = $_SERVER['HTTP_CLIENT_IP'];
		} 
		else
		{
			$ip = $_SERVER['REMOTE_ADDR'];
		}
		
		return $ip;
	}

	/*
	
	count : Retourne le nombre de connectés
	
	*/
	
	function count()
	{
		//clearstatcache();
		
		$ok = false;
		
		$timeCacheVerif = time() - $this->cache_time;
		
		if (file_exists($this->cache_file) && @filemtime($this->cache_file) > $timeCacheVerif)
		{
			$content = $this->read($this->cache_file);
			
			$key = substr($content, 0, 32);
			
			$i = substr($content, 32);
			
			if ($key == md5($i))
			{				
				$ok = true;
			}
		}
		
		if (!$ok)
		{
			if (!is_dir($this->dir)) return false;
	
			$timeVerif = time() - $this->idle;
					
			$i = 0;
	
			if ($h = opendir($this->dir))
			{
				while (false !== ($f = readdir($h)))
				{
					if ($f != '.' && $f != '..' && $f != $this->cache_filename)
					{
						$cfp = $this->dir . '/' . $f;
						
						if (@filemtime($cfp) > $timeVerif)
						{
							$i++;
						}
						else
						{
							@unlink($cfp);
						}
					}
				}
			}
			
			$this->write($this->cache_file, md5($i) . $i, 'w');
		}
						
		$this->count = $i;

		return $this->count;
	}
	
	/*
	
	write : Ecrit dans un fichier
	
	*/
	
	function write($file, $content, $mode = 'a')
	{
		$fp = fopen($file, $mode);
				
		if ($fp)
		{
			@flock($fp, LOCK_EX);
			
			@fwrite($fp, $content, strlen($content));
						
			@flock($fp, LOCK_UN);
			
			@fclose($fp);
			
			return true;
		}
		
		return false;
	}
	
	/*
	
	read : Lit dans un fichier
	
	*/
	
	function read($file)
	{		
		if (!@file_exists($file)) return false;
		
		$fp = @fopen($file, 'r');

		if ($fp)
		{
			@flock($fp, LOCK_SH);
			
			$content = @fread($fp, @filesize($file));
			
			@flock($fp, LOCK_UN);
			
			@fclose($fp);

			return $content;
		}
		
		return false;
	}

}

}

?>

Conclusion

Vos commentaires sont les bienvenus.

-------------
UTILISATION
-------------

include('counter.class.php');
$counter = new counter('howmany/', 60);
$counter->update();

echo $counter->view();

 

Historique

07 mars 2008 12:19:33 :
J'ai fais plusieurs modifications : - Utilisation de PHP 4 au lieu de PHP 5. - Résolution du problème d'écriture de fichier au même moment par X utilisateurs.

Commentaires et avis

signaler à un administrateur
Commentaire de crocxx2 le 04/03/2008 17:19:13

C'est normal que tu ne déclare pas la porté de tes variables?

signaler à un administrateur
Commentaire de porciner le 04/03/2008 17:21:49

Non, pas vraiment :D
En fait je ne connais pas encore tous les mots clés de PHP5 pour les classes...
Quels sont-ils ?

signaler à un administrateur
Commentaire de codefalse le 04/03/2008 17:56:43 administrateur CS

Yop :)
Un ptit trucs que j'ai remarqué qui aurait pu t'éviter du code en plus :
Dans ton constructeur, tu met $file = 'inc/counter.txt', $time = false, $idle = false
le premier est bon, pourquoi tu fait pas pareil avec les autres ?
euh, voila :p

signaler à un administrateur
Commentaire de crocxx2 le 04/03/2008 18:54:08

Les attributs de ta classes (les variables) en PHP5 doivent être déclaré non pas avec VAR mais avec la porté (private,public,...) en général en POO, tu déclare les propriété (variables)en privé et les méthode (fonction) en publique sauf exception. ;)

signaler à un administrateur
Commentaire de codefalse le 04/03/2008 19:16:44 administrateur CS

En fait voila comme l'a dit crocxx2, en général, tu déclare tes variables private, afin de limiter l'acces à tes données depuis l'exterieur. Ensuite tu implémente des getters/setters (si ta une variable : private $sLogin, tu peux faire un setLogin et un getLogin pour que tes autres classes y accedent).
Généralement tu donne une propriété protected quand ta classe étends d'autres classes ou pourra être étendue, et que ses propriétés doivent être accessibles depuis les classes mères/filles. C'est LA différence avec private. Private, SEUL la classe elle même à accès aux variables et fonctions (appelées méthodes) private. En protected, une classe qui étends une autre classe ayant des éléments protected pourra y avoir acces.
Une propriété public permettra l'accès à tous les éléments.

signaler à un administrateur
Commentaire de porciner le 07/03/2008 12:34:41

Merci pour toutes ces infos :-)

signaler à un administrateur
Commentaire de crocxx2 le 07/03/2008 15:56:33

Actuellement je ne pense pas que ta classe fonctionne avec la déclaration des attributs avec var, mais peu être que je me trompe. Sauf erreur de ma part ta classe devrait retourner des erreur. ;)

signaler à un administrateur
Commentaire de codefalse le 07/03/2008 17:04:00 administrateur CS

Non, sous php4 ca devrait fonctionner :)

signaler à un administrateur
Commentaire de crocxx2 le 07/03/2008 17:09:13

à oui désolé j'avais pas vu qu'il avais régressé à PHP4 ;)

Mais bon PHP4 est bientôt mort, il faudrait bientôt passer au 5 ;)

signaler à un administrateur
Commentaire de porciner le 07/03/2008 20:42:26

Oui j'ai utilisé PHP 4 car on m'a demandé une version compatible avec.
De plus, je ne maîtrise pas encore les subtilités orientées objets de PHP 5.

signaler à un administrateur
Commentaire de niceman23 le 03/06/2008 01:40:18

Salut, se petit bout code la est tu pour le nombre de visite sur ton siteweb. Ou le nombre de logged ???

Merci de m'éclaicire

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

cookies [ par Stephane ] saluty a une source (excellente) qui parle des cookies.mais pas des cookies qui durent le plus longtemp possiblesavez vous comment faire ?en fait c'es DONNER DES INFOS SUR LE VISITEUR [ par kindool ] Bonjour, je recherche tout type de code php donnant des infos sur le visiteur du site, si vous en connaissez, merci de me répondre :)genre d'infos rec etat de presence en php ? [ par sana72 ] Bonjour, je souhaiterais savoir combien de personne est connecté sur le site et qui (lors de l'autenthification).En asp je fais ça avec le global.asa Savoir qui est connecté. [ par Pyou ] J'aimerais savoir comment fait-on pour savoir qui est connecté a un site en temps reel. J'utilise un moyen d'identification et les sessions.Merci determiner connection visiteur [ par oggy ] Bonjour !Voilà, j'aimerai savoir si vous connaissez un script en PHP ou autre permettant de connaitre le type de connection du visiteur (Adsl,Rtc...)J Validité cookie ou pas pour visiteur [ par must ] Bonjour,voila veux faire un compteur de visites,mais qu'il ne s'increment pas 40 fois si on viens sur la page souhaitéeKe veux me servir d'un cookie,m Membre connecté... [ par houseclubber ] Je débute en PHP et je voulais faire un petit exercice pour m'entraîner.En fonction que l'on soit identifié ou non sur le site, certaine rubriques son script "qui est connecté" [ par Pouky ] Bonjour!!j'ai une tite question:est ce que qqun pour m'expliquer en gros le fonctionnement des scripts "qui est connecté" (comme celui qui est sur ce Authentification [ par erwan35 ] Bonjour à tous!Je viens de commencer un site en php.Ce site est calqué sur le principe codes souces, c'est à dire qu'il sera une interface de libre éc Ping sous php [ par juki_webmaster ] Bonsoir , je voudrais avoir de l'aide pour crée un script php qui en utilisant une variable constente pingré une ip est afficherais sous forme :if ...


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.