Divergence de compteur entre fichier et BDD

Divergence de compteur entre fichier et BDD - PHP - Programmation

Marsh Posté le 26-02-2008 à 18:17:06    

Bonjour, j’ai un script inclus dans mes pages qui compte le nombre de pages vues. Ce compteur est incrémenté à chaque chargement (à condition qu’un cookie ne soit pas défini sur la machine, ca me sert à m’exclure des stats). La valeur du compteur est stockée dans un fichier compteur.txt.
 
Comme j’aurais vite fait de supprimer ce fichier sans faire exprès du ftp, j’ai mis en place une sauvegarde de sécurité dans une base de données mysql, et il se trouve que la valeur contenue dans le fichier et celle contenue dans la base ne sont pas identiques. Au moment où j’écris ca par exemple, dans le fichier indique 12675 tandis que la base indique 12678.
 
Je ne comprends pas d’où vient cette divergence, voici le code :

Code :
  1. <?php
  2. function cpt_vues(){
  3. // on créé un fichier compteur.txt s'il existe po
  4. if(!file_exists("etc/compteur/compteur.txt" )){
  5.  $fichier = fopen("etc/compteur/compteur.txt","w+" );
  6.  fclose($fichier);
  7. }
  8. // on incrémente le compteur de 1 dans le fichier compteur.txt
  9. $fichier = fopen("etc/compteur/compteur.txt","r+" );
  10. $cpt = fgets($fichier,12)+1;
  11. fseek($fichier,0);
  12. fputs($fichier,$cpt);
  13. fclose($fichier);
  14. //on incrémente aussi le compteur de sécurité dans la base de données
  15. @mysql_query("UPDATE minidata SET valeur = valeur+1 WHERE nom='compteur_vues'" ) or die (mysql_error());
  16. return join('',file("etc/compteur/compteur.txt" ));
  17. }
  18. //si le cookie est défini, alors on se contente d'afficher le nombre de pages vues
  19. if(!compter_stats()){
  20. echo join('',file("etc/compteur/compteur.txt" )).' - <font color="red">stats perso off</font>';
  21. }
  22. //sinon, on met à jour le compteur et on affiche le nombre de pages vues
  23. else
  24. echo cpt_vues();
  25. ?>


Merci de m’éclairer sur cette sombre affaire.


---------------
cours pour débuter sous 3d studio max - Photoshop pour les nuls
Reply

Marsh Posté le 26-02-2008 à 18:17:06   

Reply

Marsh Posté le 27-02-2008 à 15:26:27    

Bon j'ai trouvé (enfin un membre d'un autre forum) l'origine du problème : apache et donc php exécutent les requêtes en parallèle.
Ainsi si 2 requêtes surviennent presque en même temps (à 10-20 ms d'intervalle) le compteur n'est incrémenté que de 1.


---------------
cours pour débuter sous 3d studio max - Photoshop pour les nuls
Reply

Marsh Posté le 27-02-2008 à 15:59:47    

bienvenue dans les accès concurrentiels. Tu devrais tout placer dans ta base de données, elle faite pour cela.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed