Hello, j'explore actuellement une solution pour mettre en place un compteur de vue par article avec un champs "viewCount" dans une table "Posts" correspondant aux articles.

seulement comme je prévois que le site puisse avoir un certain volume de visite, je recherche une solution la plus légère possible pour ne pas surcharger la BDD en requêtes d'écriture à chaque chargement de page du visiteur.

Si quelqu'un a déjà traité pareil cas, une solution est la bienvenue :)

7 réponses


A mon avis la requête suivante est ce qui sera le plus légère

UPDATE Posts SET viewCount = viewCount + 1 WHERE Posts.id=$page_id

Oui c'est le plus light en effet. La problématique est celle-ci :
J'aimerai faire avec un peu plus de précisions (en tenant compte de l'IP et de la date pour ajouter une vue par exemple), ça oblige à un petit traitement et à écrire 3 ou 4 données supplémentaires en BDD par visite.

Je me dis que ça pourrai être lourd en cas de "pic" de visiteurs (plusieurs milliers / heure), est-ce le cas ? est-ce que ça peut considérablement ralentir le site ou pas ?

boostyweb.fr
Moi j'ai opté pour une solution qui est d'enregistré l'ID du dernier article en Session.
J'y ai pensé en prenant pourprincipe que tu tu as consulté l'article tu ne vas pas retourner dessus... C'est pas bulletproof j'en convient :)
Tu pourrais stocker tous les id consultés dans la session... mais peut-être qu'en terme de performances quelqu'un sur le long terme dans un gros volume ca peut mouliner pour comparer...

Le meilleur moyen serait effectivement par base de donnée, mais rien t'empeche d'utiliser par au -dessus un systeme de session (même si c'est pour le dernier article consulté) pour économiser une requete de lecture si un gars tente d'auto refresh compme un abruti.

Après si ton site est soumis a un gros traffic, tu dois tout faire pour mettre en cache le maximum d'élément. (le contenu de l'article, les commentaires...)

Déjà se serait bien de nous dire ce que tu veux exactement, car dans ton sujet tu nous parles juste d'un compteur de page, et après d'un système plus complet.

Pour les sessions je ne suis pas pour pour plusieurs raisons dont la principale est la temporalité des sessions/cookies.

Ensuite la structure de la table (ou des tables) vont varier selon ce que tu cherches exactement. Si tu veux avoir un historique complet de la navigation des utilisateurs, il va falloir passer par une table pivot. Si c'est juste un compteur pour savoir le nombre de fois que chaque page est vue, alors un simple update comme j'ai indiqué dans ma première réponse.

Enfin pour répondre à ta dernière question : un simple calcul. Quelques milliers/heure => quelques centaines/minute => quelques dizaine/seconde. Pour ainsi dire rien, sauf si tu es chez un mutualisé tout pourri (et encore)

Ce système je ne l'avais fais que pour les personnes logués, plus simple pour garder en mémoire qu'ils on vu le topic.

Je n'ai jamais dis que ce n'est pas faisable. c'est juste que selon ce que l'on souhaite ce n'est pas une bonne solution et à la lecture de son second post je ne pense pas que se soit pour une utilisation par les utilisateurs

Pour te répondre Lolotoobo,

1/ C'est pour une utilisation pour TOUS les users (visiteurs lambdas et membres connectés)

2/ je cherche à mettre en place un système similaire à ce qu'on peut par exemple voir sur un site d'info comme "Le plus Nouvel Obs" pour afficher les vues par articles. Ton système est en effet hyper light mais le problème c'est qu'il compte absolument tout (si je recharge 100 X, il va compter 100 vues). Comme je cherche un système un peu plus sérieux, je vais prendre en compte l'IP et éventuellement la date pour pouvoir à nouveau compter une vue sur le même IP 24h plus tard par exemple.

Je vais donc opter pour un truc un peu plus lourd, Tant pis pour la perf. :)

Je crois effectivement que je n'ai pas d'autre choix que d'en passer par un enregistrement en BDD à chaque vue comptée avec un petit traitement PHP à chaque affichage d'un article pour savoir si je compte la vue ou non.

Ma grosse interrogation, c'était de savoir si un tel traitement n'était pas trop préjudiciable à la rapidité du site.

Tu m'as répondu que non Lolotoobo, j'espère que tu as raison :)

Merci à vous 2 pour vos éclairages.