Tracer un utilisateur sur un site web

Elodie
Invité n'ayant pas de compte PHPfrance

21 mars 2009, 19:23

Bonjour à tous !

J'aimerais pouvoir tracer un utilisateur sur mon site web, c'est à dire pouvoir enregistrer les mouvements qu'il effectue sur mon site, les pages qu'il visite.

J'avais pensé à stocker un numéro identifiant en cookie, et à chaque changement de page enregistrer le mouvement en base de données.
Le gros problème c'est qu'à chaque chargement de page, je fais donc un INSERT ou un UPDATE sur ma base, ce qui entraine une perte de performances assez conséquente.

J'aimerai donc utiliser les sessions.
je stocke chaque mouvement de l'internaute dans une variable session $_SESSION['trace'] et à la destruction de la session, ou bien, lorsque la session n'est plus valide, j'enregistre le contenu de la variable $_SESSION['trace'] en bdd.
Je n'ai donc qu'un seul accès à la base de données.

Le problème c'est que je ne sais pas comment détecter qu'une session n'est plus valide (navigateur fermé, session_destroy, durée de la session dépassée...)
Si quelqu'un a une idée, je suis preneuse !

Toute autre idée permettant de tracer un utilsateur est bienvenue !

Merci
Elodie

ViPHP
ViPHP | 1996 Messages

21 mars 2009, 20:34

L'idée est bonne mais j'enregistrais les données avant de femer la session.
Par exemple si ton visiteur vient de la page index.php puis va vers page1.php puis vers page1.php?onglet=essai.
Tu stokes alors dans ta variable de session["trace"] qui contient un tableau constitué du nom de la page et d'un timestamp, ce qui donnerai pour le voyage du visiteur:
$_SESSION["trace"][0]= array ("page" => "index.php", "timestamp" => "123546768");
$_SESSION["trace"][1]= array ("page" => "page1.php", "timestamp" => "123546798");
$_SESSION["trace"][2]= array ("page" => "page1.php?onglet=essai", "timestamp" => "123546862");
Chaque fois qu'il va voir une page ou qu'il revient voir la même page tu met à jour le tableau via array_push.
Ensuite tu mets à jour ta base grâce à ce tableau : si le timestamp existe dèjà tu ne l'insert pas, si le timestamp existe pas tu insert la nouvelle page.

Ensuite si il ferme sa session ou autre tes données sont quand même enregistrées.
Qu'en penses tu ?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Elodie
Invité n'ayant pas de compte PHPfrance

21 mars 2009, 23:31

Salut Aureusms,

Merci pour ta réponse, mais le problème reste le même, car avec ta méthode il faut faire une requête vers la bdd à chaque chargement de page, ce que je voudrais justement éviter.
J'aimerai insérer l'ensemble du trajet du visiteur lorsque celui-ci à terminé de naviguer, donc à la fermeture de la session, ou lorsqu'il ferme son navigateur.

Existe-t-il une fonction qui permet d'exécuter du code lorsqu'une session php est terminée (session détruite, durée de la session dépassée)?

Merci

ViPHP
ViPHP | 5924 Messages

22 mars 2009, 00:45

Si c'est pour des stats, tu as déjà une très bonne solution avec tracewatch…

Eléphant du PHP | 185 Messages

24 mars 2009, 02:20

Tu peux créer un gestionnaire de session personnalisé dans des fichiers. Une fonction de garbage_collector peut être assignée, dans laquelle tu peux stocker la trace de la session en BDD.
Ainsi, tu n'aurais pas une requête INSERT par page. :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 mars 2009, 09:32

La majeure partie du temps, les majors du monde du tracking utilisent un système de fichier de log apache.
A savoir que Apache va stocker date, heure, page et IP d'accès à une page.

Il te suffit de parser ce fichier pour déterminer les différentes visites.

Il est plus simple, mais plus lourd, de gérer toi même ton propre fichier de log en PHP. A la 1ere visite, tu alloues un id à un visiteur que tu lui envoi via un cookie, puis tu stockes dans un fichier de log cet id, l'heure et la page.
A chaque fois qu'il repasse, tu ajoutes dans le log l'heure, l'id et la page.

Et une fois par jour (ou plus si tu as beaucoup de visites), tu remplaces ce fichier de log par un fichier tout neuf et tu le parses pour faire les insertions en base.
De cette manière, le seul point bloquant, c'est l'écriture sur le disque, mais PHP va bien faire pareil pour la session.
De plus, pas la peine de chercher à comprendre quand une session se termine (ce qui est quasiment impossible en PHP).
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Elodie
Invité n'ayant pas de compte PHPfrance

26 mars 2009, 09:04

Merci à tous les 3 pour votre réponse.

J'ai regardé du coté de tracewatch, un outil sympa, merci !

J'avais pensé utiliser la fonction session_save_set_handler pour indiquer au garbage_collector de faire les insert en bdd avant de supprimer les fichier sessions (et idem lors d'un session_destroy)
Mais le garbage_collector se lance de manière aléatoire.. je n'ai pas envie qu'il se lance à une heure de grande affluence..

Du coup, j'avais aussi pensé à désactiver le garbage_collector à mettre un script dans le cron qui traiterai et supprimerai les fichiers session expirés. Mais ça n'est pas réalisable dans la configuration de nos serveurs actuelle

Et finalement (j'aurai du y penser plus tot), je vais utiliser les données enregistrées par piwik (qui est déjà en place sur le site) pour retracer le trajet de l'utilisateur.

Voilà, merci encore pour vos réponses
Elodie