Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

VISITEURS CONNECTÉS EN TEMPS RÉEL


Information sur la source

Catégorie :Astuces Classé sous : visiteur, visiteurs, connectés, connecté, live Niveau : Débutant Date de création : 13/01/2008 Date de mise à jour : 18/04/2008 17:42:20 Vu : 7 168

Note :
3,75 / 10 - par 4 personnes
3,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note

Description

Ce script vous permettra de savoir combien de visiteurs sont connectés sur votre site.
Le script utilise la fonction session_start() : si vous êtes hébergé par Free, pensez à créer un dossier sessions à la racine du site.
Créez une table sur votre BDD Mysql nommée `connectes` avec 2 champs :
- sessid de type varchar (40)
- timestamp de type INT (15)
 

Source

  • <?php
  • // Script réalisé par Vyk12
  • session_start();
  • if(isset($_GET['nbre_connectes']))
  • {
  • mysql_connect('serveur','login','pass');
  • mysql_select_db('db');
  • $sql = mysql_query('SELECT COUNT(*) AS nbre_sess FROM connectes WHERE sessid = \'' . $_REQUEST['PHPSESSID'] . '\'');
  • $nbre_sess = mysql_fetch_array($sql);
  • if($nbre_sess['nbre_sess'] == 0)
  • mysql_query('INSERT INTO connectes VALUES (\'' . $_REQUEST['PHPSESSID'] . '\',\'' . time() . '\')');
  • else
  • mysql_query('UPDATE connectes SET timestamp = ' . time() . ' WHERE sessid = \'' . $_REQUEST['PHPSESSID'] . '\'');
  • $timestamp_limite = time() - 2;
  • mysql_query('DELETE FROM connectes WHERE timestamp < ' . $timestamp_limite);
  • $retour = mysql_query('SELECT COUNT(*) AS nbre_sess FROM connectes');
  • $donnee = mysql_fetch_array($retour);
  • $phrase = ($donnee['nbre_sess'] == 1) ? 'Il y a actuellement 1 personne connect&eacute;e.' : 'Il y a actuellement ' . $donnee['nbre_sess'] . ' personnes connect&eacute;es.';
  • echo $phrase;
  • mysql_close();
  • exit();
  • }
  • ?>
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  • <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
  • <head>
  • <title>Compteur connect&eacute;s en temps r&eacute;el</title>
  • <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  • <meta http-equiv="Content-Language" content="fr" />
  • <script type="text/javascript">
  • <!--
  • function nbre_connectes()
  • {
  • var xhr = null;
  • if(window.XMLHttpRequest)
  • xhr = new XMLHttpRequest();
  • else if(window.ActiveXObject)
  • xhr = new ActiveXObject('Microsoft.XMLHTTP');
  • xhr.open('GET', 'connectes.php?nbre_connectes', true);
  • xhr.onreadystatechange = function()
  • {
  • if(xhr.readyState == 4)
  • {
  • document.getElementById('connectes').innerHTML = xhr.responseText;
  • }
  • }
  • xhr.send(null);
  • }
  • //-->
  • </script>
  • </head>
  • <body onload="javascript:nbre_connectes();">
  • <script type="text/javascript">
  • <!--
  • setInterval('nbre_connectes()', 1000);
  • //-->
  • </script>
  • <p id="connectes">
  • <noscript>
  • Vous devez accepter JavaScript !
  • </noscript>
  • </p>
  • </body>
  • </html>
<?php
	// Script réalisé par Vyk12
	
	session_start();
	
	if(isset($_GET['nbre_connectes']))
	{
		mysql_connect('serveur','login','pass');
		mysql_select_db('db');
		$sql = mysql_query('SELECT COUNT(*) AS nbre_sess FROM connectes WHERE sessid = \'' . $_REQUEST['PHPSESSID'] . '\'');
		$nbre_sess = mysql_fetch_array($sql);
		if($nbre_sess['nbre_sess'] == 0)
			mysql_query('INSERT INTO connectes VALUES (\'' . $_REQUEST['PHPSESSID'] . '\',\'' . time() . '\')');
		else
			mysql_query('UPDATE connectes SET timestamp = ' . time() . ' WHERE sessid = \'' . $_REQUEST['PHPSESSID'] . '\'');
		$timestamp_limite = time() - 2;
		mysql_query('DELETE FROM connectes WHERE timestamp < ' . $timestamp_limite);
		$retour = mysql_query('SELECT COUNT(*) AS nbre_sess FROM connectes');
		$donnee = mysql_fetch_array($retour);
		$phrase = ($donnee['nbre_sess'] == 1) ? 'Il y a actuellement 1 personne connect&eacute;e.' : 'Il y a actuellement ' . $donnee['nbre_sess'] . ' personnes connect&eacute;es.';
		echo $phrase;
		mysql_close();
		exit();
	}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
	<head>
		<title>Compteur connect&eacute;s en temps r&eacute;el</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<meta http-equiv="Content-Language" content="fr" />
		<script type="text/javascript">
		<!--
			function nbre_connectes()
			{
				var xhr = null;
				if(window.XMLHttpRequest)
					xhr = new XMLHttpRequest();
				
				else if(window.ActiveXObject)
					xhr = new ActiveXObject('Microsoft.XMLHTTP');
				
				xhr.open('GET', 'connectes.php?nbre_connectes', true);
				
				xhr.onreadystatechange = function()
				{ 
					if(xhr.readyState == 4)
					{
						document.getElementById('connectes').innerHTML = xhr.responseText;
					}
				}
				xhr.send(null);
			}
		//-->
		</script>
	</head>
	<body onload="javascript:nbre_connectes();">
	<script type="text/javascript">
	<!--
		setInterval('nbre_connectes()', 1000);
	//-->
	</script>
		<p id="connectes">
			<noscript>
				Vous devez accepter JavaScript !
			</noscript>
		</p>
	</body>
</html>

Conclusion

Le script marche de la manière suivante :

- Le visiteur ouvre cette page : on récupère son id de session
- On se connecte à Mysql, on regarde si sa session est déjà dedans
- Si son id est déjà dedans, on met à jour son timestamp
- Sinon on insère son id + son timestamp
- On supprime toutes les entrées dont leur timestamp n'a pas été actualisé depuis 2 secondes
- On regarde combien il y a d'entrées et on affiche ce nombre
 

Historique

13 janvier 2008 16:34:10 :
Spécification de la table à créer.
13 janvier 2008 16:34:51 :
Spécification de la table à créer.
13 janvier 2008 18:34:37 :
Réctification d'un bug
06 avril 2008 20:41:46 :
Modification totale du code source
06 avril 2008 20:44:35 :
modification du code source
07 avril 2008 18:29:30 :
Modification code source
07 avril 2008 20:34:08 :
Résolution de différents bugs
07 avril 2008 20:38:21 :
Modif code source
09 avril 2008 15:33:30 :
Oublie d'un =
17 avril 2008 15:10:44 :
Résolution de tous les bugs : script marche à 100% (enfin je crois ...)
17 avril 2008 15:11:30 :
Résolution de tous les bugs : script marche à 100% (enfin je crois ...)
18 avril 2008 17:38:02 :
Ajout des <!-- et //--> dans le code JS
18 avril 2008 17:42:20 :
Rajout des comentaires <!-- et //--> dans les balises script

Commentaires et avis

signaler à un administrateur
Commentaire de malik7934 le 13/01/2008 16:53:22

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

signaler à un administrateur
Commentaire de Vyk12 le 13/01/2008 18:46:19

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) ;)

signaler à un administrateur
Commentaire de malik7934 le 13/01/2008 18:48:00

Oui, maintenant que tu as corrigé le code en remplaçant le "=" par un ">" !!

signaler à un administrateur
Commentaire de yoman64 le 13/01/2008 20:19:02

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 !

signaler à un administrateur
Commentaire de yoman64 le 13/01/2008 20:23:06

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...

signaler à un administrateur
Commentaire de webdeb le 14/01/2008 12:51:06

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()...

signaler à un administrateur
Commentaire de xaraan le 14/01/2008 18:03:44 4/10

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.

signaler à un administrateur
Commentaire de ThePilot le 21/01/2008 18:08:16

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 ;)

signaler à un administrateur
Commentaire de yoman64 le 21/01/2008 18:34:35

Oulala copier une source extremement mal faite à la base et dire qu'elle est de nous.... faut le faire hein ;).

signaler à un administrateur
Commentaire de Vyk12 le 21/01/2008 19:42:22

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

signaler à un administrateur
Commentaire de sankasssss le 28/01/2008 10:51:31 1/10

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 ;)

signaler à un administrateur
Commentaire de zoukozouko le 31/01/2008 13:05:55

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...)

signaler à un administrateur
Commentaire de GillesWebmaster le 27/03/2008 12:27:43 9/10

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!!!

signaler à un administrateur
Commentaire de Masarusa le 28/03/2008 11:49:26 1/10

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.

signaler à un administrateur
Commentaire de GillesWebmaster le 28/03/2008 12:22:15

Oé c'est clair, mais bon personne ne va réinventer la roue!

signaler à un administrateur
Commentaire de Vyk12 le 06/04/2008 20:43:05

Voilà j'ai modifié tout le code source, ici le compteur est beacoup plus précis et il a été créé totalement par moi !

signaler à un administrateur
Commentaire de GillesWebmaster le 06/04/2008 21:01:24

Quelle bonne idée...
Bonne soirée

signaler à un administrateur
Commentaire de yoman64 le 06/04/2008 21:38:02

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.

signaler à un administrateur
Commentaire de GillesWebmaster le 06/04/2008 21:49:48

Vous êtes vraiment acariâtres avec les nouveaux!

signaler à un administrateur
Commentaire de yoman64 le 06/04/2008 22:04:11

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 ?

signaler à un administrateur
Commentaire de Vyk12 le 07/04/2008 18:20:35

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 !!!

signaler à un administrateur
Commentaire de yoman64 le 07/04/2008 19:08:51

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 :)

signaler à un administrateur
Commentaire de Vyk12 le 07/04/2008 20:35:47

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 !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

compteur de nombre de visiteurs connecté [ par developvbdebut ] Bonjour tout le mondeQuel qu'un a ti'l déja utilisé la source de antidoteVoici le nom de la source ce dessou:COMPTEUR DE VISITEURS CONNECTÉS EN TEMPS Membre connecté... [ par houseclubber ] Je débute en PHP et je voulais faire un petit exercice pour m'entraîner.En fonction que l'on soit identifié ou non sur le site, certaine rubriques son script "qui est connecté" [ par Pouky ] Bonjour!!j'ai une tite question:est ce que qqun pour m'expliquer en gros le fonctionnement des scripts "qui est connecté" (comme celui qui est sur ce Nombre de connectés en temps réel [ par Dino ] Bonjour,Je ne trouve nulle part un code qui permet de connaitre le nombre de visiteurs sur le site en temps réel. On trouve des codes ou on considère Authentification [ par erwan35 ] Bonjour à tous!Je viens de commencer un site en php.Ce site est calqué sur le principe codes souces, c'est à dire qu'il sera une interface de libre éc Compteur unique pour visiteurs [ par must ] Salut,je voudrais faire un compteur de visites qui affiche le nombre de visiteurs,mais qu'une seule fois,quand personne viens 10 fois sur le site,le c Ping sous php [ par juki_webmaster ] Bonsoir , je voudrais avoir de l'aide pour crée un script php qui en utilisant une variable constente pingré une ip est afficherais sous forme :if ... balise <noscript> en php ??? [ par pyranhaz ] Bonjour,existe-il une façon efficace en php de rediriger tout visiteur automatiquement qui n'a pas le "active scripting" d'activé sur sa machine ???il [Session] sous ie [ par petit_stagiaire ] Bonjour,je gère des sessions pour un accès membre.Lorsqu'un utilisateur se connecte je remplis $SESSION['nom']...Mon problème vient de l'utilisation d compteur de connecté [ par mdog ] Bonjour,dans le but de réaliser un compteur de conectés pour mon site, quis era un site de jeux dans la ligné de "Rise Of Lords" etc..., j'ai besoin d


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,484 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.