begin process at 2012 02 15 14:01:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Application

 > COMPTEUR QUI NE COMPTE PAS LES RELOAD

COMPTEUR QUI NE COMPTE PAS LES RELOAD


 Information sur la source

Note :
Aucune note
Catégorie :Application Niveau :Initié Date de création :24/06/2002 Date de mise à jour :24/06/2002 11:20:05 Vu / téléchargé :4 858 / 267

Auteur : Bruce314

Ecrire un message privé
Site perso
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 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

  • <?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);
  • }
  • ?>
<?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 =&gt; 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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources de la même categorie

Source avec une capture PHPREPOGENERATOR + REPO (WIN) par alvinp
Source avec Zip IPHONE - ICÔNE D'APPEL TÉLÉPHONIQUE SUR L'ÉCRAN D'ACCUEIL par Rainbow
Source avec Zip Source avec une capture [APP WEB]SERVEUREXPLOREUR par thematrix01
Source avec Zip Source avec une capture MY.BOOKMARKS par inwebo
Source avec Zip M.V.C M.E.D par faceme

Commentaires et avis

Commentaire de Romuald le 24/06/2002 17:57:14

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");

Commentaire de Bruce314 le 24/06/2002 19:47:53

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 :-))

Commentaire de OriOn le 25/06/2002 08:57:39 administrateur CS

à kan un script de stats sur le site ??
J'ai bientôt finit le mien ;-) y me reste plus qu'à terminer ma partie graph.

Commentaire de Zenith le 09/02/2004 22:06:05

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 !!!!

Commentaire de Zenith le 09/02/2004 22:53:22

arf...
peux tu expliquer en detail commen cela fonctionne stp parce que j'y arrive pas ....? merci beaucoup ....

 Ajouter un commentaire




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 : 1,092 sec (3)

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