Compteur de visites sur fichier

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 672 fois - Téléchargée 16 fois

Contenu du snippet

Bonjour tout le monde,

Je poste un petit compteur de visites. Il s'agit de trois fonctions.
- add_visitor lit et réécrit sur l'enregistrement précédent et le cas échéant, à la fin du fichier.
- get_server_ip récupère l'ip (sans la vérifier)
- visite ne compte qu'une seule visite par session par utilisateur.

Grâce aux fonctions de formatage de texte, sprintf, fscanf, on arrive à de bons résultats, très rapidement.

Source / Exemple :


<?php
define('EXIT_SUCCESS', 0);
define('EXIT_FAILURE', 1);

function get_server_ip(){
	if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
		$ipString = $_SERVER['HTTP_X_FORWARDED_FOR']; 
		$addr = explode(',',$ipString); 
		$ip = trim($addr[sizeof($addr)-1]);
	} 
	elseif(isset($_SERVER['HTTP_CLIENT_IP'])){ 
		$ip = $_SERVER['HTTP_CLIENT_IP'];
	}
	else{ 
		$ip = $_SERVER['REMOTE_ADDR'];
	} 
	return $ip;
}
function add_visitor($visitor, $date, $file = 'compteur.txt'){
	if (FALSE === ($pt = fopen($file,'r+'))) {
		return EXIT_FAILURE;
	}
	if (!flock($pt, LOCK_EX)) {
		return EXIT_FAILURE;
	}
	$n = 1;
	while(3 === fscanf($pt, "%s\t%d\t%d\n", $ip,$nb_visite,$last_date)) {
		if ($ip === $visitor) {
			$str_len = strlen($visitor) + 15; // 3 (tab et chariot) + 4 (nombre) + 8 (date)
			$n += $nb_visite;
			// rembobiner au début de l'enregistrement concerné
			fseek($pt, - $str_len, SEEK_CUR);
			break;
		}
	}
	// écrire soit à la fin du fichier, soit sur l'enregistrement précédent
	$entry = sprintf("%s\t%04d\t%d\n", $visitor, $n, $date);
	fwrite($pt, $entry);
	flock($pt, LOCK_UN);
	fclose($pt);
	return EXIT_SUCCESS;
}

function visite(){
	session_start();
	if (!array_key_exists('welcome',$_SESSION)) {
		$_SESSION['welcome'] = TRUE;
		$ip = get_server_ip();
		// vérifier si $ip est une IP (V4 ou V6)
		if (FALSE === filter_var($ip, FILTER_VALIDATE_IP)) {
			return EXIT_FAILURE;
		}
		add_visitor($ip,date('Ymd'));
	}
	else {
		$_SESSION['welcome'] = FALSE;
	}
	return EXIT_SUCCESS;
}

Conclusion :


Comme je l'ai lu, ça peut convenir à des sites à faible trafic. Encore que, vu ce que fais la fonction visite() j'aimerais bien qu'on m'explique... S'il faut ouvrir une connexion à des SGBD, envoyer un INSERT OR UPDATE, ça fait bien ramer un gros site, non ?

N'étant pas un grand expert en sécurité, je vous propose de venir critiquer mon nouveau script.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
vendredi 15 décembre 2000
Statut
Membre
Dernière intervention
19 septembre 2011

function add_visitor($visitor, $date, $file = 'compteur.txt')
{ $ret= EXIT_FAILURE; if (TRUE ($pt fopen($file,'r+')))
{ if (flock($pt, LOCK_EX))
{
[...]

flock($pt, LOCK_UN);
$ret= EXIT_SUCCESS;
}
fclose($pt);
}
return($ret);
}
Messages postés
2
Date d'inscription
vendredi 15 décembre 2000
Statut
Membre
Dernière intervention
19 septembre 2011

Bonjour,

fopen sans fclose si flock return EXIT_FAILURE;

Dans ce cas c'est pas grave, on est en PHP avec un timeout sur l’exécution et flock avec cet argument bloque jusqu'au SUCCESS
C'est le timeout qui va terminer le script et fermer le fichier si flock fail.
Messages postés
27
Date d'inscription
lundi 12 avril 2010
Statut
Membre
Dernière intervention
15 octobre 2011

Bonjour ARTA, tu ne la vois pas car il n'y en a pas.

Je te renvoie à l'un des premiers cours de php : http://www.php.net/manual/fr/language.basic-syntax.instruction-separation.php . La balise fermante est facultative voire gênante sur les fichiers de fonctions comme celui-ci.
Messages postés
98
Date d'inscription
dimanche 22 janvier 2006
Statut
Membre
Dernière intervention
24 juillet 2013

Bonjour tous

Désolé mais je vois pas la balise de fermeture ?> ???
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
13
@X_Cli en fait tu as raison, on ne sait jamais comment le site est utilisé ou visité.
''F5 grrrr ... un javascript pour la dévalider''
... je plaisante ++
Afficher les 19 commentaires

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.