'max_user_connections'

  • Auteur de la discussion Auteur de la discussion babou
  • Date de début Date de début
Nouveau WRInaute
Bonjour à tous,

J'ai fais un site qui a un succès non attendu.

Je reçois les erreurs PHP/MYSQL par e-mail et depuis quelques jours je reçois des centaines d'e-mails chaque jour avec cette erreur :

mysql_connect(): User tre13e@ has already more than 'max_user_connections' active connections


Il y a en effet beaucoup de personnes connectés au site simultanément (Des pointes de 350 visiteurs connectés simultanément) :

Pour info les stats du site :

5 000 visiteurs uniques /jour
12 000 pages affichées / jour

Site hébergé chez OVH sur un Média Plan (20 connexions simultannées MYSQL)

J'aimerais avoir votre avis car je veux être sûr que cette erreur provient bien du nombre important de connexions avant de basculer vers l'offre supérieur de mon hébergement.

Comment en être sûr ?

Merci à vous.
 
WRInaute occasionnel
Salut,

Moi aussi j'ai eu ce probleme et cela venais en effet d'un trop grand nombre de connexions simultannées MYSQL.

Tu as plusieurs possibilitées...

- Vérifie que tu fermes rapidement les connexions MYSQL, en effet si tu l'ouvre en début de page et que tu la ferme en fin de page, la connexion restera ouverte plus longtemps...


Tu as une autre solution... Elle demande un peu de programation mais il suffit de creer plusieurs BDD... (1 table = 1 base) plutot que 1 base avec X table...


Sinon comme tu le dis tu n'as pas d'autres choix que de prendre l'offre au dessus...
 
Nouveau WRInaute
bjp> Sur les autres plans, je suis satisfait d'OVH.

chmouc> Super article mais je me pose une question :

Est-il plus intéressant de fermer la connexion vers MYSQL après chaque requête (puis en réouvrir une lors d'une nouvelle requête) ou de laisser la connexion active toute la durée du script ?

Je pose cette question car il est difficile pour moi de grouper toutes les requêtes d'une page ensemble.

Merci à vous.
 
WRInaute occasionnel
Il me semble que les fermetures de connections mysql sont inutiles avec les dernière version de php. Php s'occupe de le faire tous seul.

Sinon le mieux, c'est de faire 1 grosse requête au début qui récupère tous le nécessaire pour toute la page que des dizaines qui récupèrent qu'un petit élément.

Mysql est sur des machines différentes. 1 faisant 1 requête on ne fait qu'une connection qui occupera X Ms (millisecondes) alors que 10 requêtes par exemple en font 10 soit 10*X Ms.

Il est aussi conseiller de faire des requêtes optimisés. Il faut donc éviter au maximum de faire des "Select * from table".

Si tu fais des max_user_connections, c'est que tes scripts sont pas assez optimisés.
 
WRInaute discret
Salut,

il faut faire tout d'abord ta connexion ensuite toutes tes requêtes, fermer ensuite ta connexion et traiter les requêtes.

Exemple :

Code:
<?php
mysql_connect('hote','user','passe');
mysql_select_db('base');
$requete1=mysql_query('requête');
$requete2=mysql_query('requête');
mysql_close();

//traitement de la requête 1
while($r=mysql_fetch_row($requete1))
{

}

//traitement de la requête 2
while($r=mysql_fetch_row($requete2))
{

}
?>

voilà ;-)

a +
 
Nouveau WRInaute
anthomicro> Merci beacoup mais le problème c'est que j'utilise différentes fonctions qui font appels à MYSQL donc il est difficile pour moi de mettre en place cette méthode.

Pour ma question :

Est-il plus intéressant de fermer la connexion vers MYSQL après chaque requête (puis en réouvrir une lors d'une nouvelle requête) ou de laisser la connexion active toute la durée du script ?

Vous en pensez quoi ?

Car cette solution est, pour moi, très facile à realiser car j'tilise ces fonctions :

Code:
function myEscape($v) 
{ 
    return mysql_real_escape_string($v); 
} 
function query($q) 
{ 
    $res = mysql_query($q, SQL_CONNECT) or die( 
           (!ONLINE) ? 
           'Erreur SQL !<br />' . $q.  '<br />' . mysql_error() : 
           mail(EMAIL_4_ERRORS,'Erreur MySql','Erreur SQL !' . "\r\n" . $q .  "\r\n" . mysql_error() . "\r\n\r\n" . 'Page concernée : ' . $_SERVER['REQUEST_URI'] . "\r\n\r\n" . 'Ip : ' . ipGet())); 
     
    return $res; 
} 
function fetch_assoc($r) 
{ 
    return mysql_fetch_assoc($r); 
} 
function fetch_row($r) 
{ 
    return mysql_fetch_row($r); 
}
 
WRInaute discret
Bah franchement ouvrir et fermer la connexion après chaque requête c'est du gaspillage de ressources. Ensuite revois tes fonctions ;-)

Le deuxième argument dans la fonction mysql_query() est inutile si tu n'ouvres pas plusieurs connexions simultannément ;-)
 
Nouveau WRInaute
anthomicro a dit:
Le deuxième argument dans la fonction mysql_query() est inutile si tu n'ouvres pas plusieurs connexions simultannément ;-)
SQL_CONNECT ? Cela change t'il réellement quelque chose ? En le retiarnt je vais gagner des ressources ?
 
Nouveau WRInaute
Très bien, merci.

La limite est fixée à 20 connexions simultannées.

Pensez-vous, vu le nombre des connectés sur mon site, que cette limite est trop basse ? Ou le problème vient-il réellement de la "non optimisation" de mes scripts ?

Merci.
 
WRInaute discret
la limite est suffisante ;-)

Quand tu dis "connectés", ça veut dire connectés depuis combien de temps ? (sur mon site par exemple j'ai mis 4 minutes avant qu'un visiteur soit considéré comme déconnecté).
 
Nouveau WRInaute
Moi il sont considéré comme connectés si leur "idle" est inférieur à 10 minutes. Sachant que les actualisations/changements de pages sont très fréquentes.
 
Nouveau WRInaute
Salut,

J'ai un semblant de suggestion pour être moins limité par le nombre limité (...) de connexions: si la connexion échoue, on attend un peu (ex: 500 ms), et on retente le coup.

Code:
$Connexion = mysql_connect($host, $login, $pass) or $a=trigger_error(mysql_error()); // Si pas de connexion, $a=1

while($a==1)
{
usleep(500000);
$a=2;
$Connexion = mysql_connect($host, $login, $pass) or $a=trigger_error(mysql_error());
}

Tant que la connexion échoue, $a vaut 1, on attend et on recommence. Dans ce cas-ci, on recommence même si la raison de l'échec n'est pas liée au nombre max d'utilisateurs.
Si quelqu'un voit comment optimiser ce petit bout de code, pour exécuter la boucle uniquement si on atteint le nombre max d'utilisateurs, je suis preneur!
 
Nouveau WRInaute
Quelque chose comme ça, peut-être?

Code:
$Connexion = mysql_connect($host, $login, $pass) or $a=trigger_error(mysql_error()); // Si pas de connexion, $a=1

while($a==1 && mysql_error()="Too many connections")
{
usleep(500000);
$a=2;
$Connexion = mysql_connect($host, $login, $pass) or $a=trigger_error(mysql_error());
}
 
WRInaute discret
Et pourquoi pas ceci :

$a=1;
while($a==1)
{
usleep(500000);
$a=2;
$Connexion = mysql_connect($host, $login, $pass) or $a=trigger_error(mysql_error());
}

Mais bon ça reste une solution bancale, alors qu'il suffit d'optimiser un script pour ne plus avoir cette erreur... Mets plutôt en place un système de cache.

a +
 
Nouveau WRInaute
Oui, c'est également bon.

Concernant le système de cache, est-ce que l'on n'aurait pas un problème si des utilisateurs changent des données dans la base? Il faudra quand même s'y connecter tout le temps non, au cas où?

Ou alors, j'ai pas bien compris l'histoire des caches...
 
Nouveau WRInaute
Bon, là j'ai besoin d'un petit mot d'explication.

Je peux comprendre l'utilité du cache, si la requête que l'on exécute surtout est du type SELECT.
Mais s'il faut sans cesse updater le cache dès que l'on a des requêtes du style INSERT, ça fait plus de travail, non?
 
WRInaute discret
non, tu supprimes le cache lorsque tu fais des insert, et tu recrées le cache lorsque tu fais ta requête select. Mais bien sûr tout dépend du type de données à mettre en cache. J'utilise un cache pour mes articles par exemple car je les modifie rarement comparé au nombre de lectures, ça me fait gagner une requête à chaque fois. Quand j'update mes articles je supprime le fichier cache, et lorsqu'un internaute consulte l'article en question, je recrée le fichier cache à l'aide des données que je recueille cette fois via la requête (puisque j'ai plus de fichier cache)
 
Nouveau WRInaute
C'est pas bête, en effet.

En quand on parle de créer un fichier cache, c'est tout simplement le résultat de la requête qui est exporté dans un fichier texte ou quelque chose comme ça, je suppose...?
 
WRInaute occasionnel
Salut à tous !

Je rencontre également ce problème de "max_user_connections" depuis plusieurs jours (trop de traffic). Je tape donc "max_user_connections" sur Google et je tombre sur WRI. Google est magique :D

Je voudrais savoir ce que vous pensez de cette suggestion pour résoudre le problème :

Je crée la procédure suivante qui ouvre une connexion, exécute la requête, et referme aussitôt la connexion :
Code:
function requete( $sql )
{
	// Paramètres et identifiants de connexion
	// global $db_server, $db_user_login, $db_user_pass, $db_name;

	// Connexion au serveur
	$link = @mysql_connect( $db_server, $db_user_login, $db_user_pass ) or die ( "Erreur de connexion au serveur" );
	
	// Sélection de la base de données
	@mysql_select_db( $db_name, $link ) or die( "Erreur de sélection de la base de données\n".mysql_error() );
	
	// Exécution de la requête SQL
	$res = mysql_query( $sql );
	
	// Fermeture de la Connexion
	mysql_close( $link );
	
	// On renvoit le résultat de la requête
	return $res;
};

Puis on l'appelle à chaque fois qu'on veut faire une requête SQL :
Code:
$sql = "SELECT id,value FROM table ";

$res = requete( $sql );

while ( $resultat = mysql_fetch_array($res,MYSQL_ASSOC) )
{
	echo "$resultat[id] = $resultat[value]\n";
};



Pour l'instant je n'ai pas mis en place cette solution, j'attends juste d'avoir des avis positifs ou négatifs. Le fait d'ouvrir et de fermer la connexion SQL à chaque requête : mon petit doigt me dit que c'est pas si génial que ça .... :? Qu'en pensez-vous ?
 
WRInaute discret
Salut,

exact, ce n'est pas si génial que ça, ouvrir et fermer une connexion ça prend énormément de temps, donc il serait préférable d'ouvrir la connexion, de faire toutes tes requêtes et de fermer la connexion :)
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut