Page 1 sur 1

Refresh du compteur sans arrêt

Posté : 25 avr. 2012, 03:56
par nico44530
Bonjour,

J'ai un compteur live utilisant une base de donnée, le script JQUERY recharge le compteur toute les 5 secondes pour voir si un internaute est connecté sur le site.
J'ai peur que ça consomme beaucoup de ressource sur mon site et que ça le ralentisse.

Quelqu'un peut me dire si un refresh qui actualise sans cesse un compteur PHP peut ralentir le site ?? :?

Voici le script jquery du refresh :

[javascript]
var refreshId = setInterval(function()
{
$('span#refresh').fadeIn("slow").load('include/stats/reponse.php').fadeIn("slow");
}, 5000);
$.ajaxSetup({ cache: false });
[/javascript]

Au passage, ma méthode peuvent aider des personnes qui cherche un compteur live en ajax. \:D/

Merci

Re: Refresh du compteur sans arrêt

Posté : 25 avr. 2012, 07:11
par xTG
5 secondes c'est un peu court en effet pour un tel système. 10-15 secondes suffiraient amplement.
Sinon pour ralentissement, dès que la page est chargée cela ne devrait pas.
Par contre cela peut occasionner des ralentissements d'accès à la bdd si tu as de configuré un nombre max de connexion simultanée faible à cette dernière.

Re: Refresh du compteur sans arrêt

Posté : 26 avr. 2012, 00:25
par nico44530
Re,

5 secondes ca me parait bien, comme ca toute les 5 secondes mon compteur indique qui est en ligne.
Je n'ai pas de connexion simultanée à ma bbd, il n'y a que moi qui a accès.

Re: Refresh du compteur sans arrêt

Posté : 26 avr. 2012, 08:47
par xTG
Testes en enlevant les actions jQuery slow() pour un affichage brut.

Re: Refresh du compteur sans arrêt

Posté : 26 avr. 2012, 18:28
par nico44530
Ca enlève juste l'animation fadeIn, que je ne voyais pas d'ailleurs :D

Mais aujourd'hui j'ai eu une erreur : "has exceeded the 'max_user_connections' resource" en me connectant avec 2 ordinateurs avec la même IP.
J'ai le droit à 10 connexions simultanées, et si 10 personnes venaient à ce connecter à mon site, ils obtiendrais cette erreur à chaque fois ?? :cry:
Ou c'est juste moi qui obtiendrais cette erreur ?

Re: Refresh du compteur sans arrêt

Posté : 26 avr. 2012, 18:32
par xTG
Cela veut donc dire que ton script s'exécute en plus de 5 secondes, ou bien que tu fermes mal certains accès (bdd, fichier, ect).

Re: Refresh du compteur sans arrêt

Posté : 26 avr. 2012, 18:34
par nico44530
Voila mon script compteur live :
<?php
/***********************************
* Récupération de la configuration *
***********************************/
	
// Chemin absolu
if ( !defined('ABSPATH') )
	define('ABSPATH', dirname(__FILE__) . '/');

// Existence du fichier config.inc.php
if (!file_exists(ABSPATH . 'config.inc.php'))
{
	echo '<strong>Le fichier config.inc.php manque à l\'appel !</strong>';
	exit();
}
else
{
	require_once(ABSPATH . 'config.inc.php');

	// Connexion BDD
	$dbc = @mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
	if (!$dbc)
	{
		trigger_error('Connexion à la BDD impossible : ' . mysqli_connect_error() );
		exit();
	}

	// Récupération des données témoins
	$qry = "SELECT	DATE_FORMAT(c_lastvisit, '%Y-%m-%d') AS c_lastvisit,
					c_total
			FROM $db_table
			WHERE c_iphost = 'temoin'";
	$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));
	$data = mysqli_fetch_array($res, MYSQLI_ASSOC);

	// Nombre de visites total
	$total = $data['c_total'];

	// Dernier jour traité
	$saved_date = $data['c_lastvisit'];

	// Aujourd'hui et maintenant
	$today = date('Y-m-d');
	$now = time();

	// Si changement de jour
	if ( ($today != $saved_date) )
	{
		// Le nombre de visites de chaque visiteur de la base est remis à 0
		$qry = "UPDATE $db_table SET c_total = 0 WHERE c_iphost != 'temoin'";
		$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));

		// La date stockée est mise à jour à la date d'aujourd'hui
		$qry = "UPDATE $db_table SET c_lastvisit = CURDATE() WHERE c_iphost = 'temoin'";
		$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));

		// On vide les lignes obsolètes
		$exceed = $now - ($keep*60*60);
		$qry = "DELETE FROM $db_table WHERE c_iphost != 'temoin' AND UNIX_TIMESTAMP(c_lastvisit) < $exceed";
		$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));
	}


	/**********************************
	* Fonction de vérification des IP *
	**********************************/

	// Fonction qui vérifie si l'IP est exclue du comptage ou pas
	function ipcheck($ip_to_match, $ip_array)
	{
		if (is_array($ip_array))
		{
			foreach ($ip_array as $ip)
			{
				if (strpos($ip_to_match, $ip)===0)
				return true;
			}
		}
		return false;
	}


	/*************************
	* Traitement des visites *
	*************************/

	$ip = $_SERVER['REMOTE_ADDR'];

	// Si l'IP n'est pas dans la liste de celles à exclure
	if ( ipcheck($ip, $exclude) != true)
	{
		// On compte le nombre d'entrées correspondant à l'IP de notre visiteur
		$res = @mysqli_query($dbc,"SELECT COUNT(*) FROM $db_table WHERE c_ip = '$ip'") or die(mysqli_error($dbc));
		$row = mysqli_fetch_row($res);
		$match = $row[0];

		// Si aucune IP ne correspond, le visiteur est nouveau dans la base de données
		if ($match == 0)
		{
			$iphost = gethostbyaddr($ip);
			// Alors on ajoute son heure de connexion, son IP, et on initialise son nombre de visites à 1
			$qry = "INSERT INTO $db_table (c_firstvisit, c_lastvisit, c_total, c_ip, c_iphost) VALUES (NOW(), NOW(), 1, '$ip', '$iphost')";
			$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));
			// Et on incrémente le nombre de visiteurs
			$qry = "UPDATE $db_table SET c_total = c_total+1 WHERE c_iphost = 'temoin'";
			$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));
		}
		/*
		Si il est déjà dans la base, alors :
		- soit la période est dépassée, alors le visiteur est considéré comme nouveau
		- soit il est déjà venu dans la même période d'unicité d'un visiteur
		*/
		else
		{
			// On récupère toutes les données qui lui correspondent
			$qry = "SELECT UNIX_TIMESTAMP(c_firstvisit) AS c_firstvisit FROM $db_table WHERE c_ip = '$ip'";
			$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));
			$data = mysqli_fetch_array($res, MYSQLI_ASSOC);

			// On récupère la date de ses première et dernière visites
			$firstvisit = $data['c_firstvisit'];

			// Si la période est dépassée
			if ( ($now - $firstvisit) > ($unique*60*60) )
			{
				// Incrémentation du compteur total
				$qry = "UPDATE $db_table SET c_total = c_total+1 WHERE c_iphost = 'temoin'";
				$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));
				// On compte le visiteur comme nouveau, même si c'est dans la même journée
				$qry = "UPDATE $db_table SET c_firstvisit = NOW(), c_lastvisit = NOW(), c_total = c_total+1 WHERE c_ip = '$ip'";
				$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));
			}
			// Sinon on est dans la même période d'unicité
			else
			{
				// On met uniquement à jour l'heure de son dernier passage
				$qry = "UPDATE $db_table SET c_lastvisit = NOW() WHERE c_ip = '$ip'";
				$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));
			}
		}
	}

	/***********************
	* Stockage des données *
	***********************/

	// Nombre de visites total
	$qry = "SELECT c_total FROM $db_table WHERE c_iphost = 'temoin'";
	$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));
	$alltime = mysqli_fetch_array($res, MYSQLI_ASSOC);
	$c_alltime = $alltime['c_total'];

	// Nombres de visiteurs quotidiens
	$qry = "SELECT SUM(c_total) AS c_total FROM $db_table WHERE c_iphost != 'temoin'";
	$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));
	$today = mysqli_fetch_array($res, MYSQLI_ASSOC);
	$c_today = $today['c_total'];

	// Nombre de visiteurs en ligne
	$lastmin = $now - ($interval*60);
	$res = @mysqli_query($dbc,"SELECT COUNT(*) FROM $db_table WHERE (c_iphost != 'temoin') AND (UNIX_TIMESTAMP(c_lastvisit) >= $lastmin)") or die(mysqli_error($dbc));
	$row = mysqli_fetch_row($res);
	$c_online = $row[0];

	// On ferme la connexion à la base de données
	mysqli_free_result($res);
	mysqli_close($dbc);
}
?>
Et mon script qui rafraichit le compteur :

[javascript] var refreshId = setInterval(function()
{
$('span#refresh').load('include/stats/reponse.php');
}, 10000);
$.ajaxSetup({ cache: true });[/javascript]

Peut-tu voir les erreurs possible pour éviter ce genre d'erreur ?

Merci beaucoup :D