Présentation | Code PHP pour classifier le visiteur | Visualiser ses stats et ses visiteurs | Autres exemples ]

Dernière modification 4.3.01

Mes visiteurs

Présentation

Voici un petit script PHP élémentaire qui permet de connaître les visiteurs de son site, leurs referers (d'où ils viennent), et de faire quelques stats, c'est loin d'être parfait, il demande beaucoup à être amélioré, mais ça peut être une bonne base de départ pour quelque chose de plus "touffu".
Les avantages de ces stats est qu'il n'est pas nécessaire d'avoir une base MySQL, tout est basé sur des fichiers, il permet de connaître les 50 derniers visiteurs, de faire le cumul des OS, des navigateurs utilisés, des pays d'origine et des referers. Les inconvénients sont nombreux, ainsi ce serait cool de disposer des stats sur le temps (visiteurs par jour/semaine/mois).
Le code est librement adaptable, j'apprécierais un retour d'utilisation si vous l'adoptez.
[ Retour haut de la page ]

Le code PHP pour classifier le visiteur

Rentrons dans le vif du sujet, vous allez créer le fichier visiteurs.php3, qui sera inclu dans la page d'accueil du site comme ceci :

<?
$visiteurs="visiteurs.php3";
include($visiteurs);
?>

Votre fichier de page d'accueil doit être avec l'extension .php(3) pour être interprété par le serveur HTTP.

Voici le code de visiteurs.php3

<?

// fonction qui teste la présence d'une chaine dans une autre chaîne
// en cas de réussite une variable numérique est incrémentée
// retourne 1 ou 0
function findchaine($exploi,$chaine,&$inc,&$trouve)
{
   if (strstr($exploi,$chaine))
   {
          $retour=1;
          $inc++;
          $trouve++;
   }
   else
   {
          $retour=0;
   }
   return $retour;
}

// fichier contenant les visiteurs
// avec date, nom d'hôte (adresse IP), navigateur OS, referer
$nlog="visites.log";

// contient des referers non connus
$nref="referer.log";

// contient les stats d'une manière générale sous la forme
$nstat="stat.log";
$tabstat=file($nstat);

// première ligne les OS
// deuxième ligne les FAI
// troisième ligne les pays d'origine
// quatrième ligne les navigateurs
// cinquième ligne les referers
$os=$tabstat[0];
$fai=$tabstat[1];
$pays=$tabstat[2];
$nav=$tabstat[3];
$refer=$tabstat[4];

// chacune des lignes est construites ainsi
// 123;234;676;...
// on extrait donc chaque champ dans un tableau
// caractère séparateur le ;
$tabos=explode(";",$os);
$tabfai=explode(";",$fai);
$tabpays=explode(";",$pays);
$tabnav=explode(";",$nav);
$tabref=explode(";",$refer);

// pour le tableau des referers
// voilà l'identité de chaque champ
// vous devez mettre ici les referers de votre site
$news=$tabref[0];
$liberty=$tabref[1];
$funix=$tabref[2];
$pperso=$tabref[3];
$mail=$tabref[4];
$legratuit=$tabref[5];
$camarche=$tabref[6];
$altavista=$tabref[7];
$linuxdoc=$tabref[8];
$unknown=$tabref[9];
$forum=$tabref[10];
$linuxstart=$tabref[11];
$voila=$tabref[12];
$yahoo=$tabref[13];

// idem tableau des os
$linux=$tabos[0];
$win98=$tabos[1];
$win95=$tabos[2];
$sunos=$tabos[3];
$nt=$tabos[4];)
$hpux=$tabos[5];
$osinconnu=$tabos[6];
$mac=$tabos[7];
$irix=$tabos[8];

// tableau des fai
$guetali=$tabfai[0];
$wanadoo=$tabfai[1];
$proxad=$tabfai[2];
$grolier=$tabfai[3];
$infonie=$tabfai[4];
$cybercable=$tabfai[5];
$wol=$tabfai[6];
$club=$tabfai[7];
$univ=$tabfai[8];
$freesurf=$tabfai[9];
$liberty=$tabfai[10];
$oleane=$tabfai[11];
$fainconnu=$tabfai[12];
$inktomi=$tabfai[13];

// tableau des pays
$france=$tabpays[0];
$network=$tabpays[1];
$com=$tabpays[2];
$belge=$tabpays[3];
$ca=$tabpays[4];
$paysinconnu=$tabpays[5];
$suisse=$tabpays[6];

// tableau des navigateurs
$netscape=$tabnav[0];
$msie=$tabnav[1];
$navinconnu=$tabnav[2];
$slurpsi=$tabnav[3];
$konq=$tabnav[4];
$opera=$tabnav[5];
$weblayers=$tabnav[6];

// on extrait certaines variables
// chez le visiteur

// pour avoir les referers
$page=getenv("HTTP_REFERER");

// pour connaître son adresse IP
$ip=getenv( "REMOTE_ADDR");

// pour connaître son nom d'hôte
// à partir de l'adresse IP
$host=gethostbyaddr($ip);

// pour connaître l'OS et le navigateur
$expl=getenv("HTTP_USER_AGENT");

// on commence à rechercher si le referer du visiteur
// n'est pas déjà connu

// pour l'instant il n'est pas connu
$trouveref=0;

// on passe en revue toutes les chaînes de referer connu
// à cette endroit vous devez mettre une chaîne comprise
// dans l'URL des referers
// vos referers ne sont pas forcément les miens
findchaine($page,"news:",$forum,$trouveref);
findchaine($page,"deja.com",$forum,$trouveref);
findchaine($page,"funix.free.fr",$funix,$trouveref);
findchaine($page,"pageperso.free.fr",$pperso,$trouveref);
findchaine($page,"mailto:",$mail,$trouveref);
findchaine($page,"mail.",$mail,$trouveref);
findchaine($page,"imp.",$mail,$trouveref);
findchaine($page,"legratuit.com",$legratuit,$trouveref);
findchaine($page,"commentcamarche",$camarche,$trouveref);
findchaine($page,"altavista",$altavista,$trouveref);
findchaine($page,"libertysurf.fr/funix",$liberty,$trouveref);
findchaine($page,"linuxdoc",$linuxdoc,$trouveref);
findchaine($page,"unknown",$unknown,$trouveref);
findchaine($page,"linuxstart",$linuxstart,$trouveref);
findchaine($page,"voila",$voila,$trouveref);
findchaine($page,"yahoo",$yahoo,$trouveref);

// Si le referer n'a pas été trouvé
// on l'inscrit dans un fichier referer.log
// pour analyse ultérieure
if ($page!="" && $trouveref==0)
{
        $fref=fopen($nref,"a");
        $chaine=$page."\n";
        $rc=fputs($fref,$chaine);
        $rc=fclose($fref);
}

// Si le referer n'a pas été trouvé
// on incrémente la variable des referers inconnus
if ($trouveref==0) $unknown=$unknown+1;

// construction de la chaîne qui sera inscrite
// à la ligne 5 de stat.log
$chaineref=$news.";".$liberty.";".$funix.";".$pperso.";".$mail.";".$legratuit.";".$camarche;
$chaineref=$chaineref.";".$altavista.";".$linuxdoc.";".$unknown.";";
$chaineref=$chaineref.$forum.";".$linuxstart.";".$voila.";".$yahoo.";\n";

// On rajoute une ligne au fichier visites.log
// avec date, nom d'hôte (adresse IP), navigateur OS, referer
$d = date("d/m/Y H:i:s");
$ligne = "$d ; $host($ip) ; $expl ; $page\r\n";

if ($ip!="")
{
       $flog = fopen($nlog,"a");
       $rc  = fputs($flog,$ligne);
       $rc  = fclose($flog);
}

// on fait en sorte que le fichier ne grossisse
// pas démesurément, on le limite aux 50 dernières visites
$tablog=file($nlog);
$nblignelog=count($tablog);
if ($nblignelog>50)
{
       $limit=$nblignelog-50;
       $flog=fopen($nlog,"w+");

       for ($c=$limit;$c<=$nblignelog;$c++)
       {
                 fputs($flog,$tablog[$c]);
       }
       $rc = fclose($flog);
}

// on cherche maintenant l'OS utilisé du visiteur

// pour l'instant on l'a pas trouvé
$trouveos=0;

// on passe en revue tous les OS répertoriés
findchaine($expl,"Linux",$linux,$trouveos);
findchaine($expl,"98",$win98,$trouveos);
findchaine($expl,"95",$win95,$trouveos);
findchaine($expl,"SunOS",$sunos,$trouveos);
findchaine($expl,"NT",$nt,$trouveos);
findchaine($expl,"HP-UX",$hpux,$trouveos);
findchaine($expl,"Mac",$mac,$trouveos);
findchaine($expl,"IRIX",$irix,$trouveos);

// Si pas trouvé dans la liste, son OS est inconnu
if ($trouveos==0) $osinconnu=$osinconnu+1;

// Construction de la premièrel ligne du fichier stat.log concernant les OS
$chaine1=$linux.";".$win98.";".$win95.";".$sunos.";".$nt.";".$hpux.";";
$chaine1=$chaine1.$osinconnu.";".$mac.";".$irix.";\n";

// idem pour les FAI
$trouvefai=0;
findchaine($host,"guetali",$guetali,$trouvefai);
findchaine($host,"wanadoo",$wanadoo,$trouvefai);
findchaine($host,"proxad",$proxad,$trouvefai);
findchaine($host,"grolier",$grolier,$trouvefai);
findchaine($host,"infonie",$infonie,$trouvefai);
findchaine($host,"cybercable",$cybercable,$trouvefai);
findchaine($host,"worldonline",$wol,$trouvefai);
findchaine($host,"club",$club,$trouvefai);
findchaine($host,"univ",$univ,$trouvefai);
findchaine($host,".ens",$univ,$trouvefai);
findchaine($host,"insa",$univ,$trouvefai);
findchaine($host,".edu",$univ,$trouvefai);
findchaine($host,".u-",$univ,$trouvefai);
findchaine($host,".ece.",$univ,$trouvefai);
findchaine($host,"freesurf",$freesurf,$trouvefai);
findchaine($host,"liberty",$liberty,$trouvefai);
findchaine($host,"oleane",$oleane,$trouvefai);
findchaine($host,"inktomi",$inktomi,$trouvefai);
if ($trouvefai==0) $fainconnu=$fainconnu+1;

$chaine2=$guetali.";".$wanadoo.";".$proxad.";".$grolier.";".$infonie.";".$cybercable.";".$wol.";".$club;
$chaine2=$chaine2.";".$univ.";".$freesurf.";".$liberty.";".$oleane.";";
$chaine2=$chaine2.$fainconnu.";".$inktomi.";\n";

// idem pour les pays d'origine
$trouvepays=0;
findchaine($host,".fr",$france,$trouvepays);
findchaine($host,".net",$network,$trouvepays);
findchaine($host,".com",$com,$trouvepays);
findchaine($host,".be",$belge,$trouvepays);
findchaine($host,".ca",$ca,$trouvepays);
findchaine($host,".ch",$suisse,$trouvepays);

if ($trouvepays==0) $paysinconnu=$paysinconnu+1;

$chaine3=$chaine3.$paysinconnu.";".$suisse.";\n";

// idem pour les navigateurs
$trouvenav=0;
findchaine($expl,"Mozilla/4.7",$netscape,$trouvenav);
findchaine($expl,"Mozilla/4.6",$netscape,$trouvenav);
findchaine($expl,"Mozilla/4.5",$netscape,$trouvenav);
findchaine($expl,"Mozilla/4.07",$netscape,$trouvenav);
findchaine($expl,"MSIE",$msie,$trouvenav);
findchaine($expl,"Opera",$opera,$trouvenav);
findchaine($expl,"Weblayers",$weblayers,$trouvenav);
findchaine($expl,"Konqueror",$konq,$trouvenav);
findchaine($expl,"Slurp",$slurpsi,$trouvenav);
if ($trouvenav==0) $navinconnu=$navinconnu+1;

$chaine4=$netscape.";".$msie.";".$navinconnu.";".$slurpsi.";".$konq;
$chaine4=$chaine4.";".$opera.";".$weblayers.";\n";

// A présent on inscrit dans le fichier stat.log les nouveaux statistiques
// les caractéristiques du visiteur y ont été inscrites
$fstat=fopen($nstat,"r+");
fseek($fstat,0);
fputs($fstat,$chaine1);
fputs($fstat,$chaine2);
fputs($fstat,$chaine3);
fputs($fstat,$chaine4);
fputs($fstat,$chaineref);
fclose($fstat);

?>

Le fichier stat.log aura donc cette tête là :

485;851;456;28;463;3;175;7;2;
3;337;168;21;23;51;16;55;76;6;178;21;1363;0;
1221;350;204;67;24;587;33;
1361;649;259;0;9;8;0;
19;292;176;14;3;26;22;3;2;57;19;13;1; 45;

[ Retour haut de la page ]

Visualiser ses visiteurs et ses stats

Voilà à présent le code HTML pour pouvoir  visualiser les stats ainsi que les 50 derniers visiteurs  :

<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
   <meta name="GENERATOR" content="Mozilla/4.61 [en] (X11; I; Linux 2.2.9-19mdk i686) [Netscape]">
</head>
<body>

<center>
<h1>Statistiques de consultation</h1></center>

<center><p><br><hr WIDTH="100%"></center>

<h4><a href="#50 derniers">Mes 50 derniers visiteurs</a></h4>

<h4><a href="#FAI">FAI des visiteurs</a></h4>

<h4><a href="#OS">OS&nbsp;utilis&eacute;</a></h4>

<h4><a href="#provenance">Provenance des utilisateurs</a></h4>

<h4><a href="#browser">Navigateur utilis&eacute;</a></h4>

<h4><a href="#referer">Referer</a></h4>

<hr WIDTH="100%">
<?
$file="visites.log";
$flog = fopen($file,"r");
echo "<table border=1>";
echo "<tr><td>Date et heure</td><td>Nom (adresse IP)</td><td>Navigateur</td>";
echo "<td>Referer</td></tr>";
while ($buffer=fgetcsv($flog,4096,";"))
{
        $nav="";
        $num=count($buffer);
        $row++;
        $date=$buffer[0];
        $machine=$buffer[1];
        $ref=$num-1;
        $referer=$buffer[$ref];
        if ($referer=="") $referer="Inconnu";
        for($c=2;$c<$ref;$c++)
        {
                $nav=$nav.$buffer[$c];
        }
        if ($nav=="")
        {
                $nav="N/A";
        }
        echo "<tr><td>$date</td><td>$machine</td>";
        echo "<td>$nav</td><td>$referer</td></tr>";
}
echo "<a NAME=\"50 derniers\"></a>";
echo "<b>Mes 50 derniers visiteurs</b>";
echo "<p>";
echo "</table>";
fclose($flog);)

$stat="stat.log";
$tab=file($stat);

$os=$tab[0];
$fai=$tab[1];%)
$pays=$tab[2];)
$nav=$tab[3];%)
$ref=$tab[4];%)

$tabos=explode(";",$os);
$tabfai=explode(";",$fai);
$tabpays=explode(";",$pays);
$tabnav=explode(";",$nav);
$tabref=explode(";",$ref);

$linux=$tabos[0];
$win98=$tabos[1];
$win95=$tabos[2];
$sunos=$tabos[3];
$nt=$tabos[4];)
$hpux=$tabos[5];
$osinconnu=$tabos[6];
$mac=$tabos[7];
$irix=$tabos[8];

$guetali=$tabfai[0];
$wanadoo=$tabfai[1];
$proxad=$tabfai[2];
$grolier=$tabfai[3];
$infonie=$tabfai[4];
$cybercable=$tabfai[5];
$wol=$tabfai[6];
$club=$tabfai[7];
$univ=$tabfai[8];
$freesurf=$tabfai[9];
$liberty=$tabfai[10];
$oleane=$tabfai[11];
$fainconnu=$tabfai[12];
$inktomi=$tabfai[13];

$france=$tabpays[0];
$network=$tabpays[1];
$com=$tabpays[2];
$belge=$tabpays[3];
$ca=$tabpays[4];
$paysinconnu=$tabpays[5];
$suisse=$tabpays[6];

$netscape=$tabnav[0];
$msie=$tabnav[1];
$navinconnu=$tabnav[2];
$slurp=$tabnav[3];
$konq=$tabnav[4];
$opera=$tabnav[5];
$weblayers=$tabnav[6];

$news=$tabref[0];
$libertyref=$tabref[1];
$funix=$tabref[2];
$pperso=$tabref[3];
$mail=$tabref[4];
$legratuit=$tabref[5];
$camarche=$tabref[6];
$altavista=$tabref[7];
$linuxdoc=$tabref[8];
$unknown=$tabref[9];
$forum=$tabref[10];
$linuxstart=$tabref[11];
$voila=$tabref[12];
$yahoo=$tabref[13];

echo "<p>";
echo "<hr WIDTH=\"100%\">";
echo "<a NAME=\"FAI\"></a>";
echo "<b>FAI des visiteurs</b>";
echo "<p>";
echo "<table border=1>";
echo "<tr><td>guetali</td><td>wanadoo</td><td>proxad</td><td>grolier</td>";
echo "<td>infonie</td><td>cybercable</td><td>world online</td>";
echo "<td>club internet</td><td>universites et écoles</td><td>freesurf</td>";
echo "<td>liberty surf</td><td>oleane</td><td>inktomi</td><td>inconnu</td></tr>";
echo "<tr><td>$guetali</td><td>$wanadoo</td><td>$proxad</td><td>$grolier</td>";
echo "<td>$infonie</td><td>$cybercable</td><td>$wol</td><td>$club</td>";
echo "<td>$univ</td><td>$freesurf</td><td>$liberty</td><td>$oleane</td>";
echo "<td>$inktomi</td><td>$fainconnu</td></tr>";
echo "</table>";

echo "<p>";
echo "<hr WIDTH=\"100%\">";
echo "<a NAME=\"OS\"></a>";
echo "<b>OS utilisé</b>";
echo "<p>";
echo "<table border=1>";
echo "<tr><td>linux</td><td>Windows 98</td><td>Windows 95</td>";
echo "<td>Windows NT</td><td>SunOS</td><td>HP-UX</td>";
echo "<td>Mac</td><td>Irix</td><td>Inconnu</td></tr>";
echo "<tr><td>$linux</td><td>$win98</td><td>$win95</td>";
echo "<td>$nt</td><td>$sunos</td><td>$hpux</td><td>$mac</td><td>$irix</td><td>$osinconnu</td></tr>";
echo "</table>";

echo "<p>";
echo "<hr WIDTH=\"100%\">";
echo "<a NAME=\"provenance\"></a>";
echo "<b>Provenance des visiteurs</b>";
echo "<p>";
echo "<table border=1>";
echo "<tr><td>France</td><td>Network</td><td>.com</td><td>Belgique</td>";
echo "<td>Canada</td><td>Suisse</td><td>Inconnu</td></tr>";
echo "<tr><td>$france</td><td>$network</td><td>$com</td><td>$belge</td>";
echo "<td>$ca</td><td>$suisse</td><td>$paysinconnu</td></tr>";
echo "</table>";

echo "<p>";
echo "<hr WIDTH=\"100%\">";
echo "<a NAME=\"browser\"></a>";
echo "<b>Navigateur utilisé</b>";
echo "<p>";
echo "<table border=1>";
echo "<tr><td>netscape</td><td>msie</td>";
echo "<td>Slurp</td><td>Konqueror</td><td>Opera</td><td>Weblayers</td>";
echo "<td>Inconnu</td></tr>";
echo "<tr><td>$netscape</td><td>$msie</td><td>$slurp</td><td>$konq</td>";
echo "<td>$opera</td><td>$weblayers</td><td>$navinconnu</td></tr>";
echo "</table>";

echo "<p>";
echo "<hr WIDTH=\"100%\">";
echo "<a NAME=\"referer\"></a>";
echo "<b>Referer</b>";
echo "<p>";
echo "<table border=1>";
echo "<tr><td>News</td><td>Acces direct</td><td>Perso.libertysurf.fr/funix</td>";
echo "<td>Page perso Free</td><td>Mail</td><td>Le gratuit.com</td>";
echo "<td>Comment ca marche.net</td><td>Altavista</td><td>Yahoo</td>";
echo "<td>Linux-doc</td><td>LinuxStart</td><td>Voila</td><td>Inconnu</td></tr>";
echo "<tr><td>$forum</td><td>$funix</td><td>$liberty</td>";
echo "<td>$pperso</td><td>$mail</td><td>$legratuit</td>";
echo "<td>$camarche</td><td>$altavista</td><td>$yahoo</td>";
echo "<td>$linuxdoc</td><td>$linuxstart</td><td>$voila</td><td>$unknown</td></tr>";
echo "</table>";
?>
<p>
<hr WIDTH="100%">
</body>
</html>

Voici ce que ça donne en "vrai"

Mes visiteurs
 
 
[Retour page d'accueil FUNIX]