Compteur qui ne compte pas les reload

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

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.