VISITEURS CONNECTÉS EN TEMPS RÉEL

malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 - 13 janv. 2008 à 16:53
cs_Vyk12 Messages postés 18 Date d'inscription dimanche 2 septembre 2007 Statut Membre Dernière intervention 27 juin 2008 - 7 avril 2008 à 20:35
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45414-visiteurs-connectes-en-temps-reel

cs_Vyk12 Messages postés 18 Date d'inscription dimanche 2 septembre 2007 Statut Membre Dernière intervention 27 juin 2008
7 avril 2008 à 20:35
Voilà j'ai modifié, comme ça ça règle les 2 problèmes : plus besoin des IP des visiteurs et si ça bug pour le onunload, la session se détruit automatiquement au bout de quelques minutes ...
J'espère que je ne me trompe pas en ce qui concerne la durée de vie des sessions sinon j'ai plus qu'à remodifier !
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
7 avril 2008 à 19:08
Salut,

Pour le problème d'ip ajouter un cookie(ou une variable de session) à la vérification ça réduit déja la marge d'erreur.

Pour les deux valeurs dont tu parles si tu n'es pas derrière un proxy alors elle ne retourne rien. bref si elle retourne quelques choses tu devrait les utiliser plutot que REMOTE_ADDR pour avoir la vrai IP du client.

Pour le timeout mmm je le metterais un peu plus court. En fait tu devrais le mettre paramétrable, si quelqu'un veut le changer :)

Bonne continuation :)
cs_Vyk12 Messages postés 18 Date d'inscription dimanche 2 septembre 2007 Statut Membre Dernière intervention 27 juin 2008
7 avril 2008 à 18:20
Bonjour,

Bon alors oui s'il y a des bugs sur le navigateur il est connecté pour toujours ... je vais rajouter un timestamp qui détruira l'ip au bout de ... 20 minutes ??

Sinon pour les adresses IP, ok ce n'est pas précis (par exemple j'ai la même IP que ma soeur, autre ordinateur) mais comment faire pour différencier chaque personnes ?????
J'ai lu les autres commentaires :

$_SERVER['HTTP_X_FORWARDED_FOR'] et $_SERVER['HTTP_CLIENT_IP']

J'ai essayé de faire un echo de ces 2 variables mais les 2 ne m'affichent rien !!!

Donc pour résumé, mon script a 2 "bugs" :

- Si le navigateur bug ==> visiteur connecté pour toujours (je vais rajouter un timestamp)
- Trop imprécis à cause des IP : que me proposez-vous ?

Merci à toute réponse !!!
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
6 avril 2008 à 22:04
Personne ne te force à lire mes commentaires Gilles.

Pourquoi poste t'il une source ? Pour recevoir plein de louanges et de félicitations ? Ou pour qu'on commente afin qu'il s'améliore ?

Quand on poste une source il faut être prêt à prendre tout genre de commentaire. Je donne des conseils et je fais des critiques constructives. Certe ça peut paraitre dur mais je ne dénigre personne, je n'insulte personne et crois moi je ne prenderais pas mon temps à lire un code et à le commenter si je pensais que ça n'aiderait pas l'auteur. Et par dessus tout je ne force personne à lire/suivre mes conseils.

Phpcs est un site d'entraide, de partage et de connaissance; ce qui veut dire que :
1. ça ne sert à rien de reposter les même sources encore et encore.
2. On ne s'approprient pas le travail d'autrui.
3. Si un auteur poste une source c'est pour entendre les critiques/commentaires.

Alors je peux savoir ce qui te dérange ?
GillesWebmaster Messages postés 496 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2009 1
6 avril 2008 à 21:49
Vous êtes vraiment acariâtres avec les nouveaux!
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
6 avril 2008 à 21:38
Salut,

J'viens de lire la source et j'ai pas pigé en quoi il est plus précis ? Certe il est mis à jour via ajax, mais tu continue à juste compter par IP quand même donc la marge d'erreur est toujours très large.

BOn okay tu ne base plus une visite sur une durée, mais plutot tant que la page n'est pas fermé. L'idée est bonne mais si le navigateur plante ou ne renvoit juste pas le onunload alors quoi, l'utilisateur est connecté pour toujours ?

Ton code php est redondant et peut être largement optimisé en terme de nombre de ligne, ceci dit c'est une bonne chose que ce code soit maintenant entièrement de toi et je te souhaite une bonne continuation.
GillesWebmaster Messages postés 496 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2009 1
6 avril 2008 à 21:01
Quelle bonne idée...
Bonne soirée
cs_Vyk12 Messages postés 18 Date d'inscription dimanche 2 septembre 2007 Statut Membre Dernière intervention 27 juin 2008
6 avril 2008 à 20:43
Voilà j'ai modifié tout le code source, ici le compteur est beacoup plus précis et il a été créé totalement par moi !
GillesWebmaster Messages postés 496 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2009 1
28 mars 2008 à 12:22
Oé c'est clair, mais bon personne ne va réinventer la roue!
Masarusa Messages postés 1 Date d'inscription vendredi 28 mars 2008 Statut Membre Dernière intervention 28 mars 2008
28 mars 2008 à 11:49
Oui gilles t'a raison c'est cool d'aller chercher des codes sur d'autre site et de les taper en mettant en debut de code : // Script réaliser par Vyk12
Je trouve pas ca très honnete.
Si limite il l'avait présenté en disant :
"j'ai trouver un bon code sur un autre site qui..."
ou tout simplement en ne se l'appropriant pas ca aurais déja été mieux.

Sinon je remercie Matèo21 du SiteDuZero d'ou est tiré ce code pour son tuto, sa oui.
GillesWebmaster Messages postés 496 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2009 1
27 mars 2008 à 12:27
Arrêtez de cracher dans la soupe, certes ce code est connu, mais il reste très efficace et son auteur a tout à fait raison de le diffuser!!!
zoukozouko Messages postés 148 Date d'inscription dimanche 25 janvier 2004 Statut Membre Dernière intervention 21 janvier 2009
31 janv. 2008 à 13:05
De très curieuses ressemblances tout de même... lol
enfin, peu importe que la source soit de toi, vu que CS n'est pas un site d'awards de la meilleure (moin bonne) source.

Je trouve l'utilisation de la base très lourde.
Essai de voir si tu peux pas faire la même chose avec un simple fichier.
(La table étant elle -même un fichier, tu économiserais un paquet de requêtes, connxions, etc...)
sankasssss Messages postés 12 Date d'inscription lundi 15 janvier 2007 Statut Membre Dernière intervention 28 janvier 2008
28 janv. 2008 à 10:51
Bah c'est vrais que tu ne l'a pas copié, mais c'est quand même un fameux plagia...
L'idée reste à 200% la même.
Tu aurais du essayer de trouver des améliorations à y mettre et nous présenté un contenu différent de celui du SdZ.
Essaye de le modifier avec les idées donné plus haut, ca serais plus sympa ;)
cs_Vyk12 Messages postés 18 Date d'inscription dimanche 2 septembre 2007 Statut Membre Dernière intervention 27 juin 2008
21 janv. 2008 à 19:42
mais vous croyez que je copierais des sources pour le fun ?
J'ai juste appris le PHP sur le siteduzero, donc j'ai son style pour le moment, c'est normal que nos scripts se ressemblent <_<'
le script du siteduzero est très bien, et au début (regardez les premiers commentaires) mon script avait quelques erreurs, je n'ai donc pas fait de copier/coller
merci de réfléchir et de bien regarder avant d'accuser à torts et à travers
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
21 janv. 2008 à 18:34
Oulala copier une source extremement mal faite à la base et dire qu'elle est de nous.... faut le faire hein ;).
ThePilot Messages postés 25 Date d'inscription samedi 10 juin 2006 Statut Membre Dernière intervention 21 janvier 2008
21 janv. 2008 à 18:08
Bravo, tu maitrise le copier-coller ^^

http://www.siteduzero.com/tuto-3-174-1-tp-nombre-de-visiteurs-connectes.html#ss_part_1

-> Quasiment identique à la source du SDZ ;)
xaraan Messages postés 6 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 14 janvier 2008
14 janv. 2008 à 18:03
Quelques remarques :

1) Comme l'a dit Webdeb, il ne vaut mieux pas utiliser $_SERVER['REMOTE_ADDR']. Je me pencherais sur un autre problème avec cette variable. Si le serveur "transfert" la requête (ce qui est le cas pour les clusters et la gestion de load balancing) alors l'adresse IP de $_SERVER['REMOTE_ADDR'] ne sera pas la bonne. Tu dois utiliser de préférence HTTP_X_FORWARDED_FOR, puis HTTP_CLIENT_IP et finalement REMOTE_ADDR.

2) La modélisation de ta table n'est pas bonne ! Mis à part le problème souligné par Yoman64, on considère (pour ton script) que 1 IP = 1 utilisateur. Tu dois alors marquer l'unicité de l'adresse IP en la définissant comme clé primaire par exemple, ou en ajoutant une contrainte "unique". Tu y gagneras lors des opérations de sélection (par exemple) puisque ton champ est indexé, ce qui stoppera le parcourt de la table si le tuple est trouvé !

3) Le meilleur moyen de ne pas s'embrouiller avec les fonctions mysql est d'utiliser PDO. PHP nous offre cet excellant outil, autant l'utiliser ! D'autant plus qu'il est portable d'un serveur à un autre indépendamment de la base de données pour des requêtes simples !

4) Mêmes remarques que plus haut.
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
14 janv. 2008 à 12:51
1/ Il faut filtrer $_SERVER['REMOTE_ADDR'] car c'est une donnée fournie par le navigateur. Il faut donc s'assurer qu'elle contient bien une IP V4 ou bien une IP V6 avant. Pour ça, PHP propose des fonctions dans la doc.

2/ Evite le SELECT * et liste tes champs

3/ Remplace mysql_fetch_array() par mysql_fetch_assoc()

4/ Récupère le timestamp avec $_SERVER['REQUEST_TIME'] car c'est beaucoup plus rapide qu'un appel à une fonction

5/ Supprime ces horribles or die()...
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
13 janv. 2008 à 20:23
J'oubliais : $expire = $timestamp + 60 * 5;

Pourquoi pas faire +300 directement ? et le premier or die : OR DIE (mysql_connect());

C'est pas plutot or die(mysql_error()); ? En fait pour un bête compteur tu devrais évité les hors die qui pourrait paralyser tout un site juste parce que le compteur déconne...
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
13 janv. 2008 à 20:19
Salut,

Moi je pense que c'est une erreur de se baser uniquement sur le ip pour définir un utilisateur, tu devrais utiliser un témoin (cookie ou une session) contenant un unique id couplé a son ip ça serait une méthode fiable de définir un utilisateur.

Par exemple chez moi il y a une dizaine de PC, si mon frère et moi allons sur le site, nous allons être vu comme un seul visiteur.

Dans un café internet, ou dans un "centre internet" ou encore dans les écoles il est fort probable que plusieurs dizaines voir centaines de PC ait la meme addresse IP.

Ensuite completement inutile de récuperer les données de la première requete, un simple mysql_num_rows sauverait des ressources que tu alloue inutilement d'après moi...

Pas besoin d'un fetch array à la fin, tu récupere une seule valeure, utilise mysql_result, ou mysql_fetch_assoc si tu y tiens , mais je ne crois pas que tu es besoin de tout le tableau...


Et un dernier conseil (mais je ne suis pas sur pour celui ci, un expert le confirmera, ou l'infirmera) : En fait tu devrais même betement utilisé un champ unique pour le ip, et ensuite d'essayer un INSERT, et de "catcher" lerreur afin de faire un update si l'entré existait(erreur 1062 si ma mémoire est bonne). Si l'ip existait pas tu sauve une requete, si le ip existait tu fais deux requete... donc tu sauve des requetes.



Bonne continuation à toi ,et courage !
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
13 janv. 2008 à 18:48
Oui, maintenant que tu as corrigé le code en remplaçant le "=" par un ">" !!
cs_Vyk12 Messages postés 18 Date d'inscription dimanche 2 septembre 2007 Statut Membre Dernière intervention 27 juin 2008
13 janv. 2008 à 18:46
Non, il ne sera pas considéré comme nouveau visiteur à chaque clique car si son IP est déjà dans la BDD, il ne sera pas pris en compte (seul son timestamp sera donc mis à jour) ;)
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
13 janv. 2008 à 16:53
Salut,

euh... bon, ben déjà vu 450 fois, mais pourquoi pas...
"et d'inclure ce fichier dans toutes vos pages" + "$expire $timestamp + 60 * 5;"> un visiteur qui passe moins de 5 minutes sur une page (ce qui est la plupart du temps le cas) sera systématiquement considéré comme un nouveau visiteur à chaque clic dans ton site!

mysql_query("DELETE FROM connectes WHERE timestamp='$expire'") => si on ne tombe pas EXACTEMENT 300 secondes après l'entrée dans le site, cette requête n'aura pas lieu et l'IP ne sera pas effacée => tu auras des vieilles IPs toujours dans ta base...

Que se passe-t-il si ta table est vide? J'ai l'impression que cela donnera des messages d'erreur...

Bye
Rejoignez-nous