Compteur de visiteurs connectés avec PHP

Novembre 2012

Ici nous allons voir comment créer un compteur de visiteurs connectés à un site internet en PHP. Attention, il ne s'agit pas d'un compteur de visite journalière.

Pour cela, nous allons nous baser sur l'adresse IP des visiteurs pour différencier les différents utilisateurs connectés.

Et on va utiliser une table MySQL qui va stocker la liste des utilisateurs connectés. Cette table sera mise à jour à chaque fois qu'une page est affichée (à chaque requête HTTP).

  1. Insertion d'une ligne dans la table si l'IP n'y figure pas déjà (nouveau visiteur connecté)
  2. Mise à jour de la date de dernière activité
  3. Suppression des visiteurs qui se sont déconnectés (basé sur une durée d'inactivité)

Création de la table

La table est toute simple, elle comporte 2 champs :

  • ip : l'adresse IP du visiteur. On va s'en servir comme clé primaire, pour 2 raisons : chaque IP est unique et identifie un visiteur, et en plus ça va nous permettre d'avoir un index et donc d'optimiser les performances.
  • last_activity : timestamp UNIX, mis à jour à l'instant présent à chaque fois qu'un visiteur consulte une page

Voilà le code SQL de création de la table :

CREATE TABLE `stats_connectes` (
	`ip` VARCHAR(15) NOT NULL DEFAULT '',
	`last_activity` INT(11) NOT NULL DEFAULT '0',
	PRIMARY KEY (`ip`)
)
ENGINE=MyISAM;

Si vous voulez, et surtout si votre hébergeur le permet, vous pouvez utiliser le moteur de table MEMORY pour stocker la table dans la mémoire RAM plutôt que sur le disque et ainsi obtenir de bien meilleures performances. Ce moteur correspond parfaitement besoin :

  • Le volume de données que cette table va contenir est relativement faible
  • Ces données sont volatiles, elles n'ont pas vocation à persister

Une procédure stockée pour optimiser les performances

Maintenant qu'on a notre table, il va falloir l'utiliser. Il nous faut donc de quoi insérer des données dedans, les mettre à jour, et les supprimer.

Alors bien sur, le moyen le plus simple et le plus facile est d'utiliser des requêtes SQL envoyées depuis un script PHP. Mais comme dit plus haut, la gestion de la table connectés va consommer 3 requêtes SQL à chaque chargement de page.

Donc on va utiliser une procédure stockée qui va justement servir à mettre à jour la table (je rappelle qu'il faut au moins MySQL 5 pour pouvoir utiliser les procstock).

On ne va pas tourner autour du pot plus longtemps, voilà le code SQL de création de la procédure :

CREATE DEFINER=`root`@`localhost` PROCEDURE `update_connectes`(IN `param_older_than` INT, IN `param_ip` VARCHAR(15), IN `param_time` INT, OUT `retour_nb_co` INT)
	LANGUAGE SQL
	NOT DETERMINISTIC
	CONTAINS SQL
	SQL SECURITY DEFINER
BEGIN
	/* 1. Purge de la table connectes */
	DELETE FROM stats_connectes WHERE `last_activity` < param_older_than;

	/* 2. insert/update visiteur dans la table des connectes */
	INSERT INTO stats_connectes (`ip`, `last_activity`) VALUES (param_ip, param_time)
	ON DUPLICATE KEY UPDATE `last_activity` = param_time;

	/* 3. Comptage connectés */
	SELECT COUNT(ip) INTO retour_nb_co FROM stats_connectes;
END

Pensez juste à changer le nom d'utilisateur (root dans mon exemple).

Dans un tout autre contexte, cet article est très intéressant : changer la couleur d'une cellule si la valeur est différente.

Voilà quelques explications sur les différents paramètres de la procédure stockée :

  • param_older_than : timestamp UNIX, utilisé pour supprimer les visiteurs inactifs depuis X minutes de la table (X étant la différence entre le timestam courant et param_older_than)
  • param_ip : IP du visiteur
  • param_time : timestamp courant
  • retour_nb_co : cette variable est un paramètre sortant (OUT) contrairement au 3 premiers. Elle va contenir le nombre de visiteurs connectés (=> le nombre de tuples dans la table) après l'appel de la procédure

Tracking visiteurs connectés en PHP

Showtime !

Il ne reste plus qu'à appeler la procédure stockée depuis PHP sur chaque page.

Pour cela, on va tout simplement écrire une fonction PHP qui va appeler la procédure et retourner le nombre d'utilisateurs connectés :

<?php
function update_connectes(){
	global $pdo; // Objet PDO de connexion à la base de données

	// Préparation paramètres nécessaires à la procédure
	$ip					 = $_SERVER['REMOTE_ADDR'];
	$time				 = time();
	$inactive_time_limit = 60*5; # 5 minutes
	$older_than			 = $time - $inactive_time_limit;

	// Appel de la procédure stockée
	$stmt = $pdo->prepare("CALL update_connectes(:OLDER_THAN, :IP, :TIME, @nb_connectes);");
	$stmt->execute(array(
		':OLDER_THAN'	=> $older_than,
		':IP'			=> $ip,
		':TIME'			=> $time
	));

	// Récupération du nombre de visiteurs connectés
	$result = $pdo->query("SELECT @nb_connectes");
	$row =  $result->fetch();
	$nb_connectes = $row['@nb_connectes'];
	return $nb_connectes;
}
?>

Et voilà, c'est terminé, vous n'avez plus qu'à l'intégrer à votre site ou à votre blog Wordpress.

Fini de lire cette page ? allez faire un tour ici : girafe et repassage, ça peut vous intéresser.

1 commentaire :
commentaire n°3525 par gego64
gego64 vendredi 4 août 2017, 14:13
Bonjour,
J'avais un compteur de "visiteurs connectés" qui ne fonctionne plus avec mon nouveau site.N'étant pas très doué dans l'écriture de script je vous demande si c'est le dernier code php de votre explication (tracking visiteurs connectés en php) que je dois mettre sur ma page d'accueil à côté du compteur de visiteurs ?
Merci
facultatif
Facebook Twitter RSS Email
Forum Excel
Venez découvrir le nouveau forum excel question/réponse à la stackoverflow.com !
Forum Excel
hit parade n'en a rien a foutre du W3C Positionnement et Statistiques Gratuites Vincent Paré