Compteur de personnes présentes sur le site

Contenu du snippet

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 / Exemple :


<?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.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.