16 juillet

Créer un compteur de visiteurs

Inauguration d’une nouvelle catégorie sensiblement pareille que les portions PHP à la seule différence qu’ici, les codes sont plus développés, sont expliqués afin de permettre à ceux qui le souhaitent de comprendre son fonctionnement.

Donc ici nous allons voir comment créer un simple compteur de visiteurs connectés fonctionnant avec PHP et MySQL. Tout d’abord, on va un peu tuer les idées reçues … Un compteur « live » n’affiche pas réellement les visiteurs connectés à un instant T précis mais plutôt les personnes ayant visité la page dans un intervalle de temps relativement court (dans notre exemple, on va considérer qu’une personne est hors ligne à partir de 15 minutes d’inactivité. Cela peut bien évidemment être modifié, nous allons voir comment).

1. Structure du projet

On pourrait tout aussi bien se lancer tête baissée dans la conception du script. Cependant, pour ceux dont c’est la première approche de PHP, on va étudier d’abord la structure du compteur, l’ordre dans lequel les actions seront effectuée, etc.

On peut se poser la question : qu’est ce que fait un compteur ? (il compte … oui, mais encore ?)

En détail, un compteur – dans notre cas – dois en premier lieu récupérer les information de la visite en cours (adresse IP du visiteur et la date à l’instant de la visite), puis vérifier si elles sont déjà enregistrées dans la base de donnée. Vient alors deux cas distincts :

> Le visiteur est déjà enregistré dans la base de donnée, étant donné qu’il surfe sur le site : on se contente alors de mettre à jour la date.

> Le visiteur n’est pas dans la base de donnée : car il peut s’agir de sa première visite ou d’une visite précédée de plus qu’un quart d’heure d’inactivité. Dans ce cas, on ajoute une nouvelle entrée correspondant à ce visiteur.

Maintenant que le visiteur actuelle est enregistré, on peut effectuer un léger ménage afin de supprimer les personnes ayant quitté le site depuis 15 minutes (ou plus). Puis, une fois ces opérations faites, on compte le nombre de ligne puis on l’affiche. Voilà en résumé ce que fera notre compteur.

2. Création de la base de donnée

Afin de stocker les informations sur les visites, on va créer une table à l’intérieur d’une base de donnée MySQL. Dans l’exemple, j’ai appelé la table compteur et je l’ai conçue à l’aide de deux champs : adresse_ip (Varchar(15), Unique, Not Null) et derniere_activite (Int(16), Not Null).

CREATE TABLE  `compteur` (
`adresse_ip` varchar(15) NOT NULL,
`derniere_activite` int(16) NOT NULL,
UNIQUE KEY `adresse_ip` (`adresse_ip`)
);

3. Création du script

Le script en lui même, dans sa forme la plus basique, ne se constitue que de quelques étapes. Dans la première étape (sur laquelle nous n’allons pas trop nous attarder), on va se connecter au serveur MySQL:

mysql_connect("hote", "nom_dutilisateur", "mot_de_passe");
mysql_select_db("base_de_donnee");

Remplacez les paramètres des fonctions par les informations correspondantes à votre hébergeur.

Dans la seconde partie du script, on va traiter les informations concernant la visite actuelle. Comme précisé dans la section où nous avons vu la structure du script, on va s’occuper de deux informations : la date et l’adresse IP.

On récupère l’adresse IP

$adresse_ip = $_SERVER['REMOTE_ADDR'];

Puis on la traite dans une requête un petit peu complexe …

mysql_query("INSERT INTO compteur VALUES ('$adresse_ip',UNIX_TIMESTAMP()) ON DUPLICATE KEY UPDATE derniere_activite=UNIX_TIMESTAMP()");

Alors … que signifie cette longue requête ?

On peut tout d’abord y distinguer deux parties. La première correspond à une instruction d’insertion banale (INSERT INTO compteur VALUES (‘$adresse_ip’,UNIX_TIMESTAMP())), et une seconde un peu plus complexe que nous allons voir en détail …

Alors en fait, pour comprendre cette requête il suffit simplement de la traduire de l’anglais. Pour les moins anglicistes, « ON DUPLICATE KEY, UPDATE… » peut se traduire par : SI LA CLEF EST DUPLIQUEE, ON MET A JOUR … Aussi, cette instruction va insérer un nouvel enregistrement si l’IP n’est pas déjà présente dans la base de donnée, et si elle l’est, elle va simplement mettre à jour la date :) !

Bon ! La partie la plus dure est passée ! Maintenant on va supprimer les visiteurs n’ayant pas eu d’activité depuis au moins quinze minutes. Dans ce script, nous ne travaillons pas avec une date au format aaaa-mm-jj hh:mm:ss (exemple : 2009-07-17 17:55:22) mais avec un timestamp unix (nombre de secondes écoulées depuis le 1er Janvier 1970 à 0h00): cela facilite considérablement les calculs.

Donc dans un premier temps, on calcule le timestamp unix d’il y a un quart d’heure.  Pour cela, on peut utiliser deux méthodes.

Première méthode : on utilise la fonction strtotime, qui va traduire une chaine de caractères (en anglais) en un timestamp unix.

$est_hors_ligne = strtotime("-15 minutes");

Deuxième méthode : on utilise nos bonnes vieilles connaissances mathématiques et, sachant que dans une minutes il y a 60 secondes, on effectue le calcul :

$est_hors_ligne = time() - 15*60;

Une fois le timestamp calculé, on envoie la requête, qui est une banale instruction DELETE :

mysql_query("DELETE FROM compteur WHERE derniere_activite <= $est_hors_ligne");

La partie "cachée" du compteur, celle qui traite les données est faite. Si vous souhaitez utiliser votre compteur en arrière plan, vous pouvez vous arrêter la et stopper la connexion MySQL. Si vous souhaitez aller jusqu'au bout et afficher le nombre de visiteur, on continue par une instruction de sélection.

$nombre_visiteurs = mysql_query("SELECT COUNT(adresse_ip) FROM compteur");
echo mysql_result($nombre_visiteurs, 0);

Voila ... pour finir, on ferme la connexion :)

mysql_close();

Et vous avez maintenant un joli compteur ! Maintenant vous pouvez bien sûr le compléter en rajoutant des champs dans la base de données, en l'affichant que sur certaines pages, etc...

Vous pouvez tester le compteur ou en télécharger la source.

Voila :)
Nico.



3 commentaires

  1. T’es fou, comment tu veux que j’arrive à faire ça ? lol

    Commentaire posté le 17 juillet 2009 à 17h33 par Régis
  2. Pour moi qui n’y conais pas grand chose en informatique c’est mission impossible ton truc

    Commentaire posté le 9 août 2009 à 9h53 par Lagant
  3. à première vue, je trouve la démarche intéressante pour ceux qui n’ont jamais été inscrire quoi que ce soit dans une base de données. je vais me lancer ! merci.

    Commentaire posté le 21 septembre 2009 à 23h04 par fabienne

Laisser un commentaire