Dans un autre topic, on a eu une discussion sur les possibilités ou non possibilités d'une gestion des datas en fichiers sur le serveur plutot qu'en bdd ...
Et comme je viens de me coder un petit truc qui illustre bien la chose, je vous le livre ...
Objet : Identifier en temps réel si un visiteur est nouveau ou pas (plus besoin d'attendre analytics pour connaitre son % de nouvelles visites ...)
Mise en oeuvre : Juste un include a ajouter au debut de chaquepage de votre site
Impact sur votre base données : aucun, nada, nib, quedalle :wink:
Impact sur votre serveur : juste un dossier IP_OK avec quelques doc.txt dedans. Pensez à le creer (le code de la routine ne contient pas de is dir ni de mk dir ... ils ont sauté au gré de mes copier couper coller )
Le principe : On maintient a jour une liste des ip visiteuses du site avec pour chaque ip sa date de première visite. cette liste est stockée sous forme de petits blocs (sur les 4 premieres catactères de l'ip). Pour info (puisque vous n'avez pas à vous en préoccuper, le bloc nommé IP_24_1.txt aura un contenu de ce type :
La routine : il vous suffit de créer nv_routine.php sur votre serveur et de coller dedans le code ci-dessous :
puis d'ajouter en debut de chaquepage de votre site un simple appel par include :
En sortie :
1 - la "table" des ip est maintenue a jour
2 - deux variables vous indiquent si le visiteur est nouveau ainsi que sa date de premiere visite.
Note : On peut bien sur faire la meme chose en stockant en bdd mais le propos ici était juste de montrer que c'est tout aussi facile (sans besoin d'aspirine) et performant en fichier .txt (et donc pas besoin d'encombrer une bdd avec ce type d'infos).
Note 2 : comme j'ai fait des copier coller pour l extraire de mon code et des renommages pour rendre la chose plus lisible, il peut trainer quelques bug mineur ou faute de frappe, merci de signaler les erreurs ...
Note 3 : J'ai fait l'impasse sur les flock partant du principe que dans ce contexte ce n'est pas vital du tout et dans le cas (rare) de conflit, de toute façon le visiteur sera mémorisé à la page suivante ...
Note 4 : le choix $nv_deb_ip=$nv_addr[0].$nv_addr[1].$nv_addr[2].$nv_addr[3]; peut surprendre ... j'explique : une vieille habitude du travail dans les bdd ou chaque fois que je le peux je réduis l'utilisation des appels à des commandes et donc au moteur du langage (dans certains langages c'est important, je ne sais pas si cela a un impact en php par rapport a un substr). Idem pour les 3 tests qui suivent au lieu d'un simple str_replace.
A votre disposition si vous avez des questions sur les choix faits ...
Et comme je viens de me coder un petit truc qui illustre bien la chose, je vous le livre ...
Objet : Identifier en temps réel si un visiteur est nouveau ou pas (plus besoin d'attendre analytics pour connaitre son % de nouvelles visites ...)
Mise en oeuvre : Juste un include a ajouter au debut de chaquepage de votre site
Impact sur votre base données : aucun, nada, nib, quedalle :wink:
Impact sur votre serveur : juste un dossier IP_OK avec quelques doc.txt dedans. Pensez à le creer (le code de la routine ne contient pas de is dir ni de mk dir ... ils ont sauté au gré de mes copier couper coller )
Le principe : On maintient a jour une liste des ip visiteuses du site avec pour chaque ip sa date de première visite. cette liste est stockée sous forme de petits blocs (sur les 4 premieres catactères de l'ip). Pour info (puisque vous n'avez pas à vous en préoccuper, le bloc nommé IP_24_1.txt aura un contenu de ce type :
Code:
2010_07_11/24.155.12.83/
2010_07_14/24.107.66.174/
2010_07_17/24.139.146.155/
2010_07_22/24.122.245.184/
2010_07_31/24.161.187.65/
2010_07_31/24.196.173.243/
2010_08_03/24.161.99.99/
2010_08_03/24.192.240.80/
2010_08_04/24.13.133.85/
2010_08_08/24.122.17.8/
2010_08_12/24.118.198.193/
2010_08_12/24.141.247.77/
2010_08_13/24.144.245.97/
2010_08_13/24.132.46.191/
2010_08_19/24.183.217.111/
La routine : il vous suffit de créer nv_routine.php sur votre serveur et de coller dedans le code ci-dessous :
Code:
<?
// La routine nv_memo.php est a appeler par un include en tete de chaque page
// juste après avoir fait un start_session. Elle identifie le visiteur et maintient
// à jour la 'table' des IP datée (première apparition). En sortie, elle retourne
// deux infos :
// 1 - si le visiteur est un nouveau ou pas
// 2 - la date de premiere visite
//
// Toutes la variables du script sont préfixées $nv_ ou nv_ pour les variables session
//
// *** Note : pour ceux qui ne veulent pas gérer de sessions, il suffit de mettre $nv_session
// a false ci-dessous
//
// *** Note 2 : le format de date est AAAA_MM_JJ parce que j'en avait besoin par ailleurs sous
// cette forme mais libre a vous d'adopter un autre format. Par contre la position de la date
// devant l'ip dans les fichiers n'est pas innocente : elle permet un accès aisé à la date avec
// $nv_pos-10 quelle que soit la longueur de l'IP.
//
// *** Note 3 : J'ai retenu une longueur de 4 caractères pour le decoupage des fichiers d'IP car
// cela me semble un bon compromis en terme de ratio nb de fichiers / taille unitaire des fichiers.
// Si vous avez une très forte volumétrie de visiteurs, il pourra être opportun de gérer la chose
// avec les 5 premiers caractères (plus de fichiers mais pas de fichier trop gros).
//
// *** Note 4 : J'ai volontairement fait l'impasse sur les flock ... en effet, la nature meme du
// script fait que si sur une page, le hasard fait que ca passe pas, le visiteur a toutes les chances
// d'être correctement mémorisé à la page suivante (acceptable dans ce contexte).
$nv_session=true;
$nv_datejour=date ("Y_m_d");
// ---------- l'ip une premiere fois en debut de session
if ($nv_session)
{
if (isset($_SESSION['nv_addr']) === false)
{
$nv_addr=$_SERVER['REMOTE_ADDR'];
$_SESSION['nv_addr']=$nv_addr;
}
else
{
$nv_addr=$_SESSION['nv_addr'];
}
}
else
{
$nv_addr=$_SERVER['REMOTE_ADDR'];
}
//
// ---------- on ajoute au fichier des IP pour détection des new visitors
//
// on fabrique le nom du fichier (4 premiers car de l'ip)
$nv_deb_ip=$nv_addr[0].$nv_addr[1].$nv_addr[2].$nv_addr[3];
if ($nv_deb_ip[1] == ".")
{
$nv_deb_ip[1]="_";
}
if ($nv_deb_ip[2] == ".")
{
$nv_deb_ip[2]="_";
}
if ($nv_deb_ip[3] == ".")
{
$nv_deb_ip[3]="_";
}
$nv_chemindoc=$_SERVER["DOCUMENT_ROOT"]."/IP_OK/IP_".$nv_deb_ip.".txt";
$nv_chaine_ip="/".$nv_addr."/";
$nv_pos=false;
$nv_new=false;
if (file_exists($nv_chemindoc))
{
$nv_liste_ip=file_get_contents($nv_chemindoc);
$nv_pos=strpos($nv_liste_ip, $nv_chaine_ip);
}
if ($nv_pos === false) // c'est un new, on l'ajoute
{
$nv_fpagesreferer = fopen ($nv_chemindoc, "a+");
fputs ($nv_fpagesreferer, $nv_datejour.$nv_chaine_ip."\n");
fclose ($nv_fpagesreferer);
$nv_date_first=$nv_datejour;
$nv_new=true;
}
else // c'est un existant, on recupere date premiere visite
{
$nv_date_first=substr($nv_liste_ip, $nv_pos-10, 10);
if($nv_date_first == $nv_date_jour)
{
$nv_new=true;
}
}
// ----- En sortie
//
// $nv_new : false ou true
// $nv_date_first : date de premiere visite de l'ip
?>
puis d'ajouter en debut de chaquepage de votre site un simple appel par include :
Code:
include("nv_routine.php");
En sortie :
1 - la "table" des ip est maintenue a jour
2 - deux variables vous indiquent si le visiteur est nouveau ainsi que sa date de premiere visite.
Note : On peut bien sur faire la meme chose en stockant en bdd mais le propos ici était juste de montrer que c'est tout aussi facile (sans besoin d'aspirine) et performant en fichier .txt (et donc pas besoin d'encombrer une bdd avec ce type d'infos).
Note 2 : comme j'ai fait des copier coller pour l extraire de mon code et des renommages pour rendre la chose plus lisible, il peut trainer quelques bug mineur ou faute de frappe, merci de signaler les erreurs ...
Note 3 : J'ai fait l'impasse sur les flock partant du principe que dans ce contexte ce n'est pas vital du tout et dans le cas (rare) de conflit, de toute façon le visiteur sera mémorisé à la page suivante ...
Note 4 : le choix $nv_deb_ip=$nv_addr[0].$nv_addr[1].$nv_addr[2].$nv_addr[3]; peut surprendre ... j'explique : une vieille habitude du travail dans les bdd ou chaque fois que je le peux je réduis l'utilisation des appels à des commandes et donc au moteur du langage (dans certains langages c'est important, je ne sais pas si cela a un impact en php par rapport a un substr). Idem pour les 3 tests qui suivent au lieu d'un simple str_replace.
A votre disposition si vous avez des questions sur les choix faits ...