Compteur qui ne compte pas les reload

Soyez le premier à donner votre avis sur cette source.

Vue 5 928 fois - Téléchargée 333 fois

Description

Bon, je vais reposter, visiblement, le premier est pas passé (aurais-je cliqué un peu violemment...) Donc, ce code source sert à faire un compteur honnête, c'est à dire qui ne recompte pas chaque fois que la personne recharge votre page... C'est moins drôle, mais c'est plus efficace à mon avis pour connaître la vraie fréquentation de son site (et pour moi, c'est loin d'être glorieux)
Le fonctionnement, vu du dehors, est très simple : on l'appelle comme une image, en précisant un identifiant de la page (et oui, avec un seul source, on peut mettre facilement des compteurs sur toutes ses pages :-))
<img src="compte/Bruce_count.php?clef=ma_pag_d'accueil">
La clef, ou l'identifiant de page, doit être une chaine de caractère standard (c'est à dire que je ne sais pas ce que ça fera si vous mettez des epsaces, des caractères bizarres...) Donc, on ne met que des underscores et des lettres latines, ça évite les problèmes.

Source / Exemple :


<?php

// DEFAULT VARIABLES:
$digit_dir = "digits"; // répertoire où sont stockées les images des chiffres
$log_file = "log.txt"; // fichier de log
$compteur = "compte.txt"; //fichier qui contient le compteur à proprement parler.
$lasthit = "lasthit.txt"; // sert à ne pas compter deux fois en cas de reload
$min_width = 5 ; // Nombre de chiffres à affihcer

// les infos que me passent apache pour identifier l'utilisateur
//global $HTTP_USER_AGENT;
//global $REMOTE_ADDR;
//global $HTTP_REFERER;
//global $QUERY_STRING;

function return_error_png($error_msg) {

	$img = ImageCreate(strlen($error_msg)*7, 13);
	$red = ImageColorAllocate($img, 255, 0, 0);
	$bg = ImageColorAllocate($img, 0, 0, 0);

	// Create background
	ImageFilledRectangle($img, 0, 0, strlen($error_msg)*7, 13, $bg);
	ImageString($img, 3, 0, 0, $error_msg, $red);

	ImagePNG($img);
	ImageDestroy($img);

	return;
}

function create_counter_png($number) {
	global $digit_dir, $min_width;

	$len = strlen(strval($number));
	if($len > $min_width) $width = $len;
	else $width = $min_width;

	if(!file_exists("$digit_dir/0.gif.png")) {
		return_error_png("No pngs in $digit_dir!");
		return;
	}
	
	

    $d0 = ImageCreateFrompng("$digit_dir/0.gif.png");
    $dx = ImageSX($d0);
    $dy = ImageSY($d0);
    
	$img = ImageCreate($width*$dx, $dy);
	ImageDestroy($d0);
	
	// Now, we must take each digit and represent it

	$xoff = $width*$dx;
	
	
	while($xoff > 0) {
		$digit = $number % 10; // This takes the less significant digit of the number
		$number = $number / 10; // Remove less significant digit
		$temp = ImageCreateFrompng("$digit_dir/$digit.gif.png"); // Get number representation
		$xoff = $xoff - $dx;
		ImageCopyResized($img, $temp, $xoff, 0, 0, 0, $dx, $dy, $dx, $dy);
		ImageDestroy($temp);
	}

	ImagePNG($img);
	ImageDestroy($img);

	return;
}

function lire_compteur ($clef,$compteur) {
	
	$compte=0;
	
	if (file_exists($compteur)) {
		$fd=fopen ($compteur,"r");
		while (! feof($fd)) {
			if (fscanf ($fd,"%s %d",&$clef_lue,&$valeur) == 2) {
				if ($clef_lue == $clef) {
					$compte = $valeur;
				}
			}
		}
		fclose ($fd);
	}	
	return $compte;
}

function sauve_compteur ($clef,$compteur,$compte) {
	
	if (file_exists($compteur)) {
		$f_lis=fopen ($compteur,"r");
		$f_ecris=fopen($compteur.".temp","w");
		$trouve = false;
		
		while (! feof($f_lis)) {
			if (fscanf ($f_lis,"%s %d",&$clef_lue,&$valeur) == 2) {
				if ($clef_lue == $clef) {
					fwrite($f_ecris,"$clef $compte\n");
					$trouve = true;
				} else {
					fwrite ($f_ecris,"$clef_lue $valeur\n");
				}
			}
		}
		if ($trouve == false) {
			fwrite($f_ecris,"$clef $compte\n");
		}
		fclose ($f_lis);
		fclose ($f_ecris);
		// delete ($compteur);
		rename ($compteur.".temp",$compteur);
	} else {
		$f_ecris=fopen ($compteur,"w");
		fwrite($f_ecris,"$clef $compte\n");
		fclose ($f_ecris);
	}
}

function get_time_last_connection ($clef,$qui,$fichier) {
	
	// printf ("<BR>quand s'est connecté $qui en dernier?<BR>\n");
	
	if (!file_exists ($fichier)) {
		$last_connect = 0;
	}else {
	
		$last_connect = 0;
		
		$fd=fopen ($fichier,"r");

		while (!feof ($fd)) {
			if (fscanf ($fd,"%s %d",&$adresse,&$heure) == 2) {
				//printf ("$adresse $heure");
				if ($qui == $adresse) {
					$last_connect = $heure;
				}
			}
		}
		fclose ($fd);
	}
		
	return $last_connect;
}

function update_connec_info ($fichier,$qui) {
	$quand = time();

	if (!file_exists ($fichier)) {
		$fd=fopen ($fichier,"w");
		fwrite($fd,"$qui $quand\n");
		fclose ($fd);
	} else {
		$f_lis=fopen ($fichier,"r");
		$f_ecris=fopen($fichier.".temp","w");
		$trouve = false;
		
		while (! feof($f_lis)) {
			if (fscanf ($f_lis,"%s %d",&$qui_lu,&$quand_lu) == 2) {
				if ($qui_lu == $qui) {
					fwrite($f_ecris,"$qui $quand\n");
					$trouve = true;
				} else {
					fwrite ($f_ecris,"$qui_lu $quand_lu\n");
				}
			}
		}
		if ($trouve == false) {
			fwrite($f_ecris,"$qui $quand\n");
		}
		fclose ($f_lis);
		fclose ($f_ecris);
		rename ($fichier.".temp",$fichier);
	}
	return $quand;
} //fin de la mise à jour de la dernière connection

function compte_connection ($qui,$clef,$fichier_compteur,$fichier_lasthit) {
	$trigger = 180; //180 s entre deux valeur comptées

	$nombre=lire_compteur ($clef,$fichier_compteur);
	$derniere = get_time_last_connection ($clef,$qui,$clef.".".$fichier_lasthit);
	$now = update_connec_info ($clef.".".$fichier_lasthit,$qui);
	$nombre+=((($now-$derniere)>$trigger)?1:0);
	sauve_compteur ($clef,$fichier_compteur,$nombre);
	
	// printf ("<BR>derniere connex à $derniere\n<BR>");
	// print ("nombre de chargements $nombre\n<BR>");
	create_counter_png($nombre);

}

Header("Content-type: image/png");
if (!isset ($clef)) {
	return_error_png ("crasse $clef");
} else {
	compte_connection ($REMOTE_ADDR,$clef,$compteur,$lasthit);
}
?>

Conclusion :


Le fonctionnement du script est très simple : il est appelé comme une image, donc il doit rendre une image (c'est le rôle du header à la fin). Ensuite, il vous identifie par votre ip. Il va voir dans compte combien de fois la page a été chargée, puis il va voir dans le fichier $clef.lasthit.txt à quand remonte votre dernière connexion. Si elle date de plus que $trigger secondes (réglé par défaut à 180), il compte, et dans tous les cas, il met à jour le fihcier lasthit.
Pour marcher, il vous faudra :
  • un interpréteur php4 (à cause de la fonction fscan)
  • gd d'installé (avec une version qui peut lire les .png - chez Free, ça marche très bien)
  • un sous répertoire, précisé ar $digit_dir, qui contient 10 fichiers en .png, de même taille et de nom 0.gif.png => 9.gif.png (ils sont livrés dans le fichier zip joint)

Pour le moment, pas de bug connu, mais si vous en trouvez, vous avez des questions, vous voulez causer, vous pouvez toujours me contacter par mail à florent.revvelut@free.fr ou aller voir mon site (qui se construit petit à petit) http://florent.revelut.free.Fr

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
67
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
27 avril 2008

arf...
peux tu expliquer en detail commen cela fonctionne stp parce que j'y arrive pas ....? merci beaucoup ....
Messages postés
67
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
27 avril 2008

c'est exactement ce que je cherchais, enfin, me reste k'a tester :p mais bon, le concept est malade, je vais etudier le code et essayer de le comprendre :p
merci encor !!!!
Messages postés
822
Date d'inscription
vendredi 25 mai 2001
Statut
Modérateur
Dernière intervention
1 août 2014

à kan un script de stats sur le site ??
J'ai bientôt finit le mien ;-) y me reste plus qu'à terminer ma partie graph.
Messages postés
4
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
24 juin 2002

L'avantage de cette version est :
* d'éviter les cookies inutiles (g des copains qui détestent ça)
* de stocker les ip et les heures de connexion sur ton site... toujours intéressant
Ceci dit, l'avantage du cookie est évident sur la lourdeur de la page... Chacun son choix :-))
Messages postés
172
Date d'inscription
lundi 30 avril 2001
Statut
Membre
Dernière intervention
6 avril 2003

Un système un peu plus simple mais sans doute moins puissant que tu peux utiliser est de mettre un cookie "de session"
Du style setcookie("visiteok", "1");

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.