Visiteurs connectés en temps réel

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 862 fois - Téléchargée 18 fois

Contenu du snippet

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 / Exemple :


<?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ée.' : 'Il y a actuellement ' . $donnee['nbre_sess'] . ' personnes connecté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és en temps ré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

A voir également

Ajouter un commentaire

Commentaires

cs_Vyk12
Messages postés
18
Date d'inscription
dimanche 2 septembre 2007
Statut
Membre
Dernière intervention
27 juin 2008

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

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

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

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
Vous êtes vraiment acariâtres avec les nouveaux!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.