Compteur de visites sur fichier

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 458 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

pierreSabatier
Messages postés
27
Date d'inscription
lundi 12 avril 2010
Statut
Membre
Dernière intervention
15 octobre 2011
-
Bonjour tout le monde,

le code à proprement parler, s'arrête ligne 44. La suite est une batterie de 4 tests.

On l'utilise comme ça, en début de script :
<?php
visite();
?>

Vous avez peut-être compris que la variable $_SESSION['welcome'] est à TRUE à la première visite, puis à FALSE. Utile pour ceux qui veulent afficher un texte dynamique sur cet événement (l'entrée sur le site)

Allez, j'attends vos réactions !
cod57
Messages postés
1660
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
8 -
bonjour

j'ai une une erreur already ... donc j'ai mis session_start()
en début de fichier
il faut activer assert donc
// Activation des assertions et mise en mode discret
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);

// Création d'un gestionnaire d'assertions
function my_assert_handler($file, $line, $code)
{
echo "<hr>Échec de l'assertion :
File '$file'

Line '$line'

Code '$code'
<hr />";
}

// Configuration de la méthode de callback
assert_options(ASSERT_CALLBACK, 'my_assert_handler');

// Utilisation d'une assertion qui va échouer
assert('mysql_query("")');
pierreSabatier
Messages postés
27
Date d'inscription
lundi 12 avril 2010
Statut
Membre
Dernière intervention
15 octobre 2011
-
COD57 > session_start() doit toujours être appelé avant le moindre affichage (même un espace, ou un retour chariot), c'est la source de ton erreur.

Je n'ai pas fait de zip, mais il faut voir deux fichiers distincts :
- le premier s'arrête ligne 44, il s'agit du fichier de fonction que j'ai appelé "visite.php",
- le second est un fichier de test, que j'ai placé dans le même répertoire (je l'ai appelé "visite_test.php")

Pour les assert, oui, tu les configures bien. C'est plus propre que mon WARNING.

Et qu'en penses-tu ?
cod57
Messages postés
1660
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
8 -
Oui en effet j'avais un echo qui trainé (pas vu, scuzy) ... ça à l'air de bien fonctionner maintenant ...
Oui ton code peut être une alternative pour se passer de mysql

A++
pierreSabatier
Messages postés
27
Date d'inscription
lundi 12 avril 2010
Statut
Membre
Dernière intervention
15 octobre 2011
-
Super si ça fonctionne.

Mon code ne remplacera cependant jamais un SGBD. En effet, MySql fait de bonnes choses et ce que j'ai écrit reste très simple.

Mais merci, je prend ça pour un encouragement.

A+

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.