Faire un compteur de visiteurs en temps réel en PHP

  • Ce petit script tout bête est très utile pour les administrateurs qui ont besoin de savoir le nombre de personnes connectées sur leur site. Ils pourront ainsi mettre leur site ou leur application web à jour quand personne n’est en ligne. Cela peut éviter quelques conflits entre les saisies des utilisateurs et les modifications des administrateurs.
  • Il n’y pour le moment qu’une seule manière de fonctionner pour connaître le nombre d’utilisateurs qu’il y a sur votre site. Il faut stocker son adresse IP en base de données avec un timestamp que l’on fait expirer au bout de 5 minutes.
  • Pré-requis de ce script :
    • Un script PHP « visiteurs.php » que l’on inclus sur chaque page de notre site et un second script « compteur.php » pour lire le nombre de visiteurs actuellement connectés.
    • Une table « visiteurs » en base de données avec deux colonnes :
      • Une colonne « adresse_ip » de type chaîne de caractères pour stocker l’adresse IP du visiteur connecté (la taille de la chaîne est au maximum de 15 car c’est une adresse IP).
      • Une colonne « timestamp » de type « int » pour stocker le moment (retour de la fonction PHP time) où le visiteur s’est connecté au site.

Voici la structure de la table « visiteurs » en base de données (ici MySql)

  • Le script « visiteurs.php » :
    • Lorsqu’un visiteur arrive sur le site, on regarde en base de données si son adresse IP est déjà stockée ou non en base de données.
    • Si l’utilisateur est déjà présent, on met à jour son timestamp afin qu’il n’expire pas dans moins de 5 minutes.
    • S’il n’est pas présent en base de données, on insert une nouvelle ligne dans la table « visiteurs » avec l’adresse IP du visiteur et un timestamp à jour.
    • On regarde ensuite dans la table « visiteurs » s’il n’y a pas de lignes qui ont un timestamp supérieur à 5 minutes. Si oui, on supprime ces lignes de la base de données.

Voici un exemple de code de ce script

<?php
    /**************************** CONNEXION A LA BASE DE DONNEES ****************************/
    $db;
    $stmt = null;
    $host ="localhost";
    $sql_user = "userdb";
    $sql_password = "userdbpw";
    $database_name = "userdb";

    try
    {
        // En  MySql
        $db = new PDO('mysql:dbname='.$database_name.';host='.$host, $sql_user, $sql_password);
        // En PostGreSql
        //$db = new PDO('pgsql:dbname='.$database_name.';host='.$host, $sql_user, $sql_password);
    }
    catch (PDOException $e){    die("Erreur:".$e--->getMessage());    }

    /************* REQUETE POUR VOIR SI LE VISITEUR EST DEJA EN BASE DE DONNEES *************/
    $select = "SELECT adresse_ip FROM visiteurs WHERE adresse_ip='".$_SERVER['REMOTE_ADDR']."';";
    $stmt_entrees = $db->query($select);

    /***************** SI LE VISITEUR N'EST PAS PRESENT EN BASE DE DONNEES ******************/
    if($stmt_entrees->rowCount() == 0)
    {
        // On insere une nouvelle ligne en base de données
        $requete = "INSERT INTO visiteurs (adresse_ip, timestamp)
                           VALUES ('".$_SERVER['REMOTE_ADDR']."','".time()."');";
    }

    /****************** SI LE VISITEUR EST DEJA PRESENT EN BASE DE DONNEES ******************/
    else
    {
        // On met a jour le timestamp du visiteur en base de données
        $requete = "UPDATE visiteurs
                           SET timestamp='".time()."'
                           WHERE adresse_ip = '".$_SERVER['REMOTE_ADDR']."';"."\n";
    }
    // On execute la requete
    $stmt = $db->exec($requete);

    /******************* ON SUPPRIME LES TIMESTAMPS DE VISITEURS EXPIRES ********************/
    $timestamp_5min = time() - (60 * 5); // Etat du timestamp il y a 5 minutes
    $requete = "DELETE FROM visiteurs WHERE timestamp < ". $timestamp_5min.";";     $stmt = $db->exec($requete);

    /******************** FERMETURE DE LA CONNEXION A LA BASE DE DONNEES ********************/
    $db = null;
?>
  • Le script « compteur.php » :
    • Lorsque l’administrateur exécute ce script, il regarde tout d’abord en base de données les timestamps expirés et supprime les lignes concernées (exactement comme le script précédent).
    • Ensuite on compte le nombre de lignes présentes dans la table « visiteurs » de la base de données.

Voici un exemple de code de ce script


<?php

    /**************************** CONNEXION A LA BASE DE DONNEES ****************************/
    $db;
    $stmt = null;
    $host ="localhost";
    $sql_user = "userdb";
    $sql_password = "userdbpw";
    $database_name = "userdb";

    try
    {
        // En  MySql
        $db = new PDO('mysql:dbname='.$database_name.';host='.$host, $sql_user, $sql_password);
        // En PostGreSql
        //$db = new PDO('pgsql:dbname='.$database_name.';host='.$host, $sql_user, $sql_password);
    }
    catch (PDOException $e){    die("Erreur:".$e->getMessage());    }

    /******************* ON SUPPRIME LES TIMESTAMPS DE VISITEURS EXPIRES ********************/
    $timestamp_5min = time() - (60 * 5); // Etat du timestamp il y a 5 minutes
    $requete = "DELETE FROM visiteurs WHERE timestamp < ". $timestamp_5min.";";
    $stmt = $db->exec($requete);

    /***************** REQUETE POUR COMPTER LE NOMBRE DE VISITEURS EN LIGNE *****************/
    $select = "SELECT COUNT(adresse_ip) as nb_visiteurs FROM visiteurs GROUP BY adresse_ip;";

    // On execute la requete
    $stmt = $db->prepare($select);
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC);

    // On affiche le nombre de visiteurs en ligne
    echo 'Il y a actuellement '.$result['nb_visiteurs'].' visiteur(s) sur votre site.';

    /******************** FERMETURE DE LA CONNEXION A LA BASE DE DONNEES ********************/
    $db = null;
?>

4 commentaires

  • Victor dit :

    Merci pour ce script !

    Pour que celui-ci marche correctement, il faut effectivement exécuter le fichier « compteur.php » en ligne de commande.

  • Caro dit :

    Bonsoir,

    Comment peut-on voir sur une page le nombre de visites , sans passer par la DBB ? Merci.

  • Mickaël dit :

    Bonsoir,

    Dans ce cas, vous n’avez pas d’autre choix que de passer par un site tiers qui utilise un script pour compter le nombre de visite. Je vous invite à voir Google Analytics qui remplit très bien cette fonction.

  • forum dit :

    très utile ce tuto merci infiniment Merci pour vos informations