begin process at 2012 02 12 09:39:15
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > COMPTEUR DE PERSONNES PRÉSENTES SUR LE SITE

COMPTEUR DE PERSONNES PRÉSENTES SUR LE SITE


 Information sur la source

Note :
7,5 / 10 - par 2 personnes
7,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseau & Internet Classé sous :compteur, personnes, simultanées, connectées, rss Niveau :Débutant Date de création :20/07/2007 Date de mise à jour :11/08/2007 12:57:19 Vu :11 179

Auteur : Chamyky

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note


 Description

Ces fonctions permettent de compter le nombre de personne présentes sur le site au même moment.
La première fonction est à appeler à chaque chargement d'une page de votre site.
Elle prend trois arguments : un chemin de dossier (sans le slash) où seront stockées les infos relatives aux personnes, un nom qui sera utilisé par les deux cookies créés par le système (en plus d'un suffixe différent pour chacun) et un intervalle, c'est à dire le temps en secondes au bout duquel les personnes seront considérées comme déconnectées du site.

La deuxième fonction permet de lire le nombre de visiteurs actuellement, et par la même occasion de nettoyer les vieux fichiers. Elle prend le chemin du dossier et l'intervalle comme arguments.

L'identification se fait par cookies, mais pour éviter un surcomptage à cause d'une non-activation des cookies sur le navigateur d'un visiteur, le visiteur ne peut être compté qu'à sa deuxième visite, après que le script aie vérifié l'existence d'un cookie créé à la première visite.

Les visiteurs se voient attribuer un numéro, en fonction de la disponibilité. Pendant que la fonction effectue une boucle while avec le numéro de recherche allant en augmentant, elle teste si le fichier n'existe pas, ou si son âge est supérieur à l'intervalle (pour le remplacer).
Chaque visiteur a un code (un numéro unique, puisque tiré d'un fichier s'incrémentant à chaque fois), ainsi si il revient après la date de validité de son fichier (c'est à dire, la valeur "intervalle") il ne peut pas reprendre la même place, si elle est déjà prise par un autre.

Dans le fichier .php est incluse une autre fonction toute simple sur laquelle repose la principale, elle permet tout simplement d'écrire une valeur dans un fichier.

Source

  • <?php
  • function enregistrerValeur($chemin, $valeur) {
  • $fp = fopen($chemin, 'w');
  • fputs($fp, $valeur);
  • fclose($fp);
  • }
  • function surveillerFrequentation($cheminDossier, $nomCookies, $intervalle) {
  • // Variables
  • $date = date("YmdHis");
  • $trouverPlace = false;
  • $expire = 365*24*3600;
  • // Création du dossier et fichiers si nécessaire
  • if (file_exists($cheminDossier.'/lNumPass.sys') == false) {
  • @mkdir($cheminDossier);
  • enregistrerValeur($cheminDossier.'/lNumPass.sys', '0');
  • }
  • // Vérification des cookies
  • if ($_COOKIE['survNum'.$nomCookies] == "") {
  • // Première visite (ou cookies désactivés)
  • setcookie('survNum'.$nomCookies, 'premiereVisite', time()+$expire);
  • } else if ($_COOKIE['survNum'.$nomCookies] == 'premiereVisite') {
  • // Cookies activés -> on peut l'enregistrer dans la BDD
  • $trouverPlace = true;
  • } else {
  • // A déjà un cookie -> vérification du numéro (il se peut que pour X raison ce soit un autre qui ait ce numéro désormais)
  • if ($_COOKIE['survCode'.$nomCookies] == @file_get_contents($cheminDossier.'/'.$_COOKIE['survNum'.$nomCookies].'.cod')) {
  • // On met à jour la date
  • enregistrerValeur($cheminDossier.'/'.$_COOKIE['survNum'.$nomCookies].'.dat', $date);
  • } else {
  • // Numéro non valide -> retrouve une place
  • $trouverPlace = true;
  • }
  • }
  • if ($trouverPlace) {
  • // Recherche d'une place
  • $na = 0;
  • while (true) {
  • if (file_exists($cheminDossier.'/'.$na.'.dat') == false) {
  • // Place libre !
  • break;
  • } else {
  • $dateFichier = file_get_contents($cheminDossier.'/'.$na.'.dat');
  • $age = $date-$dateFichier;
  • if ($age > $intervalle) {
  • // Trop vieux !
  • break;
  • }
  • }
  • $na++;
  • }
  • // Création des fichiers
  • $codAct = file_get_contents($cheminDossier.'/lNumPass.sys');
  • $codAct++;
  • enregistrerValeur($cheminDossier.'/lNumPass.sys', $codAct);
  • enregistrerValeur($cheminDossier.'/'.$na.'.dat', $date);
  • enregistrerValeur($cheminDossier.'/'.$na.'.cod', $codAct);
  • // Cookies
  • setcookie('survNum'.$nomCookies, $na, time()+$expire);
  • setcookie('survCode'.$nomCookies, $codAct, time()+$expire);
  • }
  • }
  • function lireFrequentation($cheminDossier, $intervalle) {
  • // Variables
  • $date = date("YmdHis");
  • $expire = 365*24*3600;
  • $nombreTotal = 0;
  • // Listage des fichiers
  • $fichiers = glob($cheminDossier.'/*.dat');
  • foreach($fichiers as $fichier) {
  • $dateFichier = file_get_contents($fichier);
  • $age = $date-$dateFichier;
  • if ($age > $intervalle) {
  • // Trop vieux : On le supprime, et on ne le compte pas
  • unlink($fichier);
  • unlink($cheminDossier.'/'.basename($fichier, '.dat').'.cod');
  • } else {
  • $nombreTotal++;
  • }
  • }
  • return $nombreTotal;
  • }
  • ?>
<?php
function enregistrerValeur($chemin, $valeur) {
	$fp = fopen($chemin, 'w');
	fputs($fp, $valeur);
	fclose($fp);
}
function surveillerFrequentation($cheminDossier, $nomCookies, $intervalle) {
	// Variables
	$date = date("YmdHis");
	$trouverPlace = false;
	$expire = 365*24*3600;
	// Création du dossier et fichiers si nécessaire
	if (file_exists($cheminDossier.'/lNumPass.sys') == false) {
		@mkdir($cheminDossier);
		enregistrerValeur($cheminDossier.'/lNumPass.sys', '0');
	}
	// Vérification des cookies
	if ($_COOKIE['survNum'.$nomCookies] == "") {
		// Première visite (ou cookies désactivés)
		setcookie('survNum'.$nomCookies, 'premiereVisite', time()+$expire);
	} else if ($_COOKIE['survNum'.$nomCookies] == 'premiereVisite') {
		// Cookies activés -> on peut l'enregistrer dans la BDD
		$trouverPlace = true;
	} else {
		// A déjà un cookie -> vérification du numéro (il se peut que pour X raison ce soit un autre qui ait ce numéro désormais)
		if ($_COOKIE['survCode'.$nomCookies] == @file_get_contents($cheminDossier.'/'.$_COOKIE['survNum'.$nomCookies].'.cod')) {
			// On met à jour la date
			enregistrerValeur($cheminDossier.'/'.$_COOKIE['survNum'.$nomCookies].'.dat', $date);
		} else {
			// Numéro non valide -> retrouve une place
			$trouverPlace = true;
		}
	}
	if ($trouverPlace) {
		// Recherche d'une place
		$na = 0;
		while (true) {
			if (file_exists($cheminDossier.'/'.$na.'.dat') == false) {
				// Place libre !
				break;
			} else {
				$dateFichier = file_get_contents($cheminDossier.'/'.$na.'.dat');
				$age = $date-$dateFichier;
				if ($age > $intervalle) {
					// Trop vieux !
					break;
				}
			}
			$na++;
		}
		// Création des fichiers
		$codAct = file_get_contents($cheminDossier.'/lNumPass.sys');
		$codAct++;
		enregistrerValeur($cheminDossier.'/lNumPass.sys', $codAct);
		enregistrerValeur($cheminDossier.'/'.$na.'.dat', $date);
		enregistrerValeur($cheminDossier.'/'.$na.'.cod', $codAct);
		// Cookies
		setcookie('survNum'.$nomCookies, $na, time()+$expire);
		setcookie('survCode'.$nomCookies, $codAct, time()+$expire);
	}
}
function lireFrequentation($cheminDossier, $intervalle) {
	// Variables
	$date = date("YmdHis");
	$expire = 365*24*3600;
	$nombreTotal = 0;
	// Listage des fichiers
	$fichiers = glob($cheminDossier.'/*.dat');
	foreach($fichiers as $fichier) {
		$dateFichier = file_get_contents($fichier);
		$age = $date-$dateFichier;
		if ($age > $intervalle) {
			// Trop vieux : On le supprime, et on ne le compte pas
			unlink($fichier);
			unlink($cheminDossier.'/'.basename($fichier, '.dat').'.cod');
		} else {
			$nombreTotal++;
		}
	}
	return $nombreTotal;
}
?>

 Conclusion

Cette source était développée à l'origine pour pouvoir compter le nombre d'abonnés à un flux RSS, en réglant l'intervalle à une semaine par exemple. Mais l'exemple d'un nombre de visiteurs simultanés est plus utile, je pense.
Et puis, je ne suis pas sûr que les navigateurs ne gèrent les cookies lors de la lecture d'un flux.


Pour l'utiliser, copier-collez-la dans un fichier .php, compteurVisiteurs.php par exemple. Ensuite, dans chacun de vos pages php, utilisez include() avec le chemin de votre page et appelez la fonction surveillerFrequentation() (attention, il ne doit pas y avoir de texte ou de echo avant).
Puis, à tout moment, vous pourrez appeler la fonction lireFrequentation() qui retournera le nombre de visiteurs actuellement sur le site.


 Historique

20 juillet 2007 14:41:01 :
J'avais oublié le S à "personnes", dans le titre >_> ...
20 juillet 2007 16:32:34 :
Il restait une erreur dans le code, et j'avais laissé des fonctions superflues...
20 juillet 2007 18:30:03 :
Remplacement de la fonction chargerValeur() par file_get_contents(), qui fait la même chose en mieux et qui est intégrée à PHP.
21 juillet 2007 13:21:06 :
Eh bien, je me suis vraiment trompé de partout moi ! Je remplace dateComplete() qui n'est pas définie par date("YmdHis"). Et enlève un "m" à "supprimer"...
23 juillet 2007 13:37:26 :
Ajout de l'explication de mise en place, utilisation de file_exists pour savoir si un fichier existe.
05 août 2007 20:40:50 :
Remplacement des guillemets doubles inappropriés, fusion de deux echo() consécutifs.
11 août 2007 12:57:19 :
Suppression d'un echo() utilisé pour le débogage.

 Sources de la même categorie

Source avec Zip TAPI : METTRE EN RELATION DEUX POSTES TELEPHONIQUES par ravery
Source avec Zip CLIENT / SERVEUR : LES SOCKETS par Morphinof
Source avec Zip VALIDATEUR_3WC par lezj
Source avec Zip MYGGL GOOGLE API CLASS FOR BEGINERZ par lezj
CLASSE WIKILOC par aKheNathOn

 Sources en rapport avec celle ci

Source avec Zip COMPTEUR DE CLIQUE PHP AVEC JQUERY par devgoneti
COMPTEUR DE VISITE - FICHIER TXT - CODE MINIMAL par SuperChouquette
Source avec Zip Source avec une capture COMPTEUR LIVE TXT TRÈS SIMPLE par clad87
Source avec Zip DÉBUTANT : FONCTION POUR TRANSFORMER UN TEMPS EN SECONDES EN... par MonkeyIsBack
Source avec Zip INTERFACE ADMIN par mitchmitch74

Commentaires et avis

Commentaire de pyrrah le 20/07/2007 18:03:43

Ta source est pas mal mais bon il existe aussi le php / mySQL comme source.
J'ai rien à dire sur ton code :)

Commentaire de Chamyky le 20/07/2007 18:27:41

Eh bien, ici l'avantage c'est que c'est facile à mettre en place : quand on appelle la fonction, elle va même jusqu'à créer le dossier spécifié si nécessaire... il n'y a vraiment rien à faire ^^ !

Par contre, je vais encore changer quelque chose : ma fonction chargerValeur est totalement inutile... vu qu'il existe (je l'ai appris aujourd'hui, merci de ne pas rire :p ) file_get_contents.

Commentaire de TheSin le 21/07/2007 09:30:32

J'ai 2 petites questions :

- Une méthode "dateComplete()" est utilisée, mais je n'en voit pas sa définition :(. Où est-elle ?

- N'est-ce pas un peu lourd que d'utiliser x fichiers pour x connectés, plutôt que de simplement utiliser une BDD ?

Sinon, rien à redire au niveau du code ;-)

Commentaire de Chamyky le 21/07/2007 13:19:10

Oh, mince... la fonction dateComplete() est une fonction toute simple, qui retourne date("YmdHis"). Comme j'utilise très souvent ce format d'heure, j'avais décidé d'en faire une fonction... mais j'ai voulu en affranchir le code présenté sur Codes-sources.
Mais il semblerait que je me sois trompé, j'ai juste enlevé la fonction... je corrige ça.
Et, en réalité j'ai un peu de mal avec les bases de données MySQL... déjà parce que c'est tordu à installer (je suis sous Mac, donc ça entre en conflit avec le serveur Apache/PHP qui est intégré au système) et ensuite parce que... eh bien, j'ai toujours trouvé ça compliqué.
Et puis, là, il suffit de copier-coller le code dans un fichier, et d'appeler les fonctions; alors que si je m'appuyais sur une base, il faudrait d'abord créer la table appropriée, fournir des infos de connexion au script...

Commentaire de TheSin le 22/07/2007 09:16:05

Ah, ok pour la fonction, au moins c'est corrigé ;-).
Je reconnais qu'installer un serveur MySQL n'est pas forcément aisé, mais c'est quand même recommendé. L'avantage, c'est que tu peux avoir un énorme nombre de données déportées, triées en cascades, et qui permettront de rechercher énormément d'informations bornées très rapidement (le secret des SGBDR).
Ce serait donc je pense un meilleur outil pour ton script.
Si t'as pas de machine Windows dans le pire des cas pour être sûr d'une bonne installation qui tourne, dommage.
Ca m'étonne quand meme que MySQL rentre en conflit avec apache/php, à moins que ca soit php4 qui soit installé sur ton système ?

Commentaire de Chamyky le 22/07/2007 11:54:13

Hum, je ne suis pas sûr que ça rentre vraiment en conflit... j'avais essayé MAMP (l'équivalent de WAMP, logique), mais il me semble que ça fonctionnait d'une façon bizarre... plus tordue que la solution intégrée au système, en fait.
Disons-le tout cru, j'ai sûrement dû abandonner par fainéantise ^^ ! Je devais encore être un peu frileux à ce moment là.
Oui, il faudra vraiment que je me mette au MySQL...

Commentaire de Naixn le 22/07/2007 20:04:41

Personellement sous Mac, je n'ai absolument jamais eu aucun de pb pour installer un serveur MySQL... Jamais eu cette histoire de conflit :-/
Sinon, si tu te sens frileux, tu peux toujours installer XAMPP ( http://www.apachefriends.org/en/xampp-macosx.html )

Sinon pour le code, le coup d'ouvrir les fichiers (avec fopen) pour tester s'ils sont présents sur le disque, ça me semble un peu lourd. Même très lourd. Regarde du côté de la fonction file_exists ( http://fr2.php.net/file_exists ).

Aussi, prends l'habitude de coder en anglais. Des fonctions et noms de variable en français avec une syntaxe en anglais, c'est pas très beau. Et surtout, pas portable du tout.

Commentaire de macleod7 le 23/07/2007 13:20:14

Bonjour,
J'aurais aimé utilisé cette source, à la place d'un service de site externe, j'ai donc mis cette source dans un fichier que j'ai appellé visitor.php, et je souhaiterais appeller ce script dans une autre page, j'ai donc fait une include du fichier et ensuite appellé la fonction, mais apparement cela mais des erreurs, vu qu'il y ait trois fonctions laquelle appeller ? ou doit je mettre tout ce code dans ma page principale, ce qui allourdirais la page, merci de vos conseils.

Commentaire de Chamyky le 23/07/2007 13:30:18

@Naixn : Eh bien, ça faisait un bout de temps que j'avais essayé, donc il n'y a pas dû avoir de conflit... j'ai sûrement confondu avec autre chose.
Je regarderais du côté de XAMPP.
Ah, la vérification d'existence... une vieille habitude, à mes débuts j'avais trouvé ça sur un site, et je n'avais pas cherché à faire mieux depuis... il est temps de changer.
Et, coder en anglais, pourquoi pas.
@macleod7 : En effet, j'ai oublié d'expliquer précisément le fonctionnement, je vais modifier tout de suite.
En fait, il suffit d'appeler la fonction surveillerFrequentation() à chaque ouverture de page, avec les arguments appropriés... mais avant que quoi que ce soit ne soit envoyé au client (c'est à dire, aucun fonction echo, et ton code doit être en haut de la page, pour qu'il n'y ai pas de texte avant) car elle fait appel aux cookies.
Et ensuite, n'importe où dans n'importe quelle page (à condition bien sûr d'avoir fait l'include) tu peux appeler la fonction lireFrequentation(), qui retournera le nombre de visiteurs actuellement.

Commentaire de jiminy2 le 01/08/2007 01:05:01

2 commentaires:

Le problème avec la fonction : @mkdir($cheminDossier);, c'est qu'elle marche pas sur certains serveurs, et le répertoire ne peut pas être créé.

D'autre part, il vaut mieux utiliser les sessions que les cookies, car le navigateur peut ne pas les accepter et la ça marchera pas.

Commentaire de Chamyky le 01/08/2007 11:31:18

@jiminy2 : Ah, en effet... eh bien, dans ce cas là il suffira de créer le dossier, ce n'est pas trop un problème.
Et pour les sessions... encore un truc sur lequel j'ai lu, mais dont je n'ai jamais essayé de me servir... je ne vais pas réécrire la source en utilisant les sessions, mais c'est peut-être plus approprié, oui.

Commentaire de jean84 le 05/08/2007 19:34:26

@Naxim :
"Aussi, prends l'habitude de coder en anglais. Des fonctions et noms de variable en français avec une syntaxe en anglais, c'est pas très beau. Et surtout, pas portable du tout."

On ne parle pas de portabilite pour les commentaires du codes :-S
Et je vois pas trop ce que tu veux dire par "[...]Des fonctions et noms de variable en français avec une syntaxe en anglais[...]"

@Chamyky :
Quelques remarques :
- quit a utiliser les ' au lieu des ", fait le completement. Si je regarde ta fonction setcookie() => setcookie("survNum".$nomCookies, "premiereVisite", time()+$expire);
Tu peut utilsier les ' dans ce cas, surtout si tu concatenes.
Idem pour les clefs des tableaux => $_COOKIES['clef']; Pas besoin d'utiliser les " .

----
echo $na;
echo $codAct;

Ne sert a rien, fait plutot echo $na, $codeAct;
C'ets plus lisible et tu ne solicite pas 2 fois le navigateur.

---
Tu ne verifies pas le retour des fonctions unlink() et setcookie(). D'apres leurs prototype, elles retournent toutes les 2 un boolean. A toi de verifier donc si leurs actions ont ete realises avec succes ou pas. Et comme l'a suggere Jiminy, les sessions sont plus interessantes dans ce genre de code ;-)

++

Commentaire de Chamyky le 05/08/2007 20:34:40

@Jean84 :
Je vais appliquer tes remarques pour les guillemets... je ne connaissais pas non plus le truc pour les echo (eh bien, j'ai bien fait de poster cette source moi !).

Pour le retour des unlink()... si je le vérifie, c'est pour l'afficher. Si je l'affiche, il vaudrait mieux que je le fasse de manière cachée, c'est à dire que ça apparaisse uniquement dans la source; le visiteur s'en fiche. Mais comment puis-je "cacher" du texte dans la source ?
Et pour le setcookie(), euh, il n'y a pas vraiment d'utilité... si ?

Commentaire de TheSin le 06/08/2007 00:29:08

pour setcoockie (), je pense que ça peut être intéressant dans les logs, histoire de savoir si une erreur s'est produite et de tenter de la résoudre, même si c'est dans de rares situations.

Commentaire de Chamyky le 06/08/2007 11:12:53

Mais dans ce cas là, ça regarde plutôt le développer qui utilise ma source; je ne vais pas rajouter de création de fichiers si ça ne sert que dans de rares cas...

Et aussi, je ne vois pas quels pourraient être ces problèmes, chez PHP.net ils ne signalent que l'envoi d'un cookie après le premier envoi de données au client.

Commentaire de pyrrah le 07/08/2007 17:52:54

Je n'aime pas trop le système avec les cookies.
Certains internautes désactivent ce mode.
Comme on le dit plus haut la méthode php / mySQL est mieux.
6/10.

Commentaire de V4mp le 22/09/2007 11:32:56

MySQL 20fois mieux je pense, mais pas mal il faut que tu face un script antiflood il y 'en n'a qui s'amuse a envoyer des requetes en boucle un simple bot en php peut le faire et provoque un bug :s..

Et pour les cookies ça m'inspire pas confiance :}!

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

liste des personnes connectées [ par PIEDPIED13 ] bonjour.Dans un site où les gens doivent choisir un pseudo en entrant, est ce qu'on peut obtenir la liste des "pseudo connectés" en passant par les va RSS sans le design [ par morpheus262 ] Bonjour,j ai developpé un systeme de flux RSS sur mon site, pas de probleme tout se passe bien le flux se met a jour, et mon lecteur de RSS (thunderbi Compteur de clics sur un bouton [ par jipe32 ] Bonjourje possede un moteur de recherches et je voudrais savoir si on pouvais compter le nombre de clics sur le bouton rechercher.merciJipe32 Compteur de clic sur un lien.... [ par astrosug44 ] Bonjour,j'ai une page web en html ou je met à disposition de tous un logiciel gratuit...et je voudrait compter le nombre de clic sur le lien de télech formulaire + compteur [ par babaslow ] Bonjour, J'ai un problème de débutant avec ce script : [code] <?php $commentaire = $_POST['commentaire']; $commentaire.="*"; $cpt = 1; if ($co formulaire + compteur [ par babaslow ] C'est bon, c'est résolu. @+++ Script php cookies [ par babaslow ] Bonjour, J'aimerais savoir si vous connaissez un script php qui permet d'identifier un visiteur via un cookie et d'incrémenter un compteur pour ses Flux rss sécurisé [ par lefter ] Bonjour,je souhaiterai solicité votre savoir pour vous posez une petite question :     Est-il possible de forcer un flux RSS seulement en liaison par Flux RSS [ par piep14 ] Bonjour, je cherche a diffuser sur mon site des news provenant de flux rss, c'est a dire en xml, mais je ne trouve pas !!!Merci de votre aide compteur d'acces a une image [ par franco_se ] bonjourje voudrais savoir s'il est possible de compter le nombre d'appel d'une image par un site distant?en fait, j'utilise une image sur un forum, et


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,073 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales