Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/03/2011, 14h42   #1
Invité de passage
 
Inscription : décembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 24
Points : 2
Points : 2
Par défaut Too many connections avec max_co à 350

Bonjour,

Je possède un site qui peut être relativement visité à certaines heures de la journée (~1000 visiteurs simultanés).

Lorsque le site atteint à peine ~200 visiteurs simu, il commence à ramer et à afficher des erreurs internes à foison. Ces erreurs 500 sont des exceptions lancées : Too many connections.
La connexion qui foire est celle distante que je fais à mon serveur dédié (j'ai testé avec la même DB en local et tout fonctionne, pas d'erreur, donc j'en déduis que cette connexion qui foire. J'ai une seconde connexion qui est directement faite sur le site en local. Pas de soucis avec celle-ci).
Cependant, le nombre max de connexion est à 350 dans le my.cnf de mon MySQL.

J'ai fais différents tests, que ce soit avec PDO ou MySQLi :
Code :
1
2
3
4
5
6
7
8
9
10
mysqli :
Warning: mysqli::mysqli() [mysqli.mysqli]: (HY000/2003): Can't connect to MySQL server on 'xx.xx.xx.xx' (110) in /homez.xx/teraevol/www/site/test.php on line 5
Warning: mysqli::prepare() [mysqli.prepare]: Couldn't fetch mysqli in /homez.xx/teraevol/www/site/test.php on line 7
Fatal error: Call to a member function execute() on a non-object in /homez.xx/teraevol/www/site/test.php on line 8
 
pdo (sans exception) :
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'xx.xx.xx.xx' (110)' in /homez.xx/teraevol/www/site/test.php:5 Stack trace: #0 /homez.xx/teraevol/www/site/test.php(5): PDO->__construct('mysql:host=xx.xx.xx.xx', 'xxxx', 'xxxx') #1 {main} thrown in /homez.xx/teraevol/www/site/test.php on line 5
 
pdo (avec exception) :
Fatal error: Uncaught exception 'Exception' with message 'SQLSTATE[08004] [1040] Too many connections on line 53' in /homez.xx/teraevol/www/site/includes/database.inc.php:65 Stack trace: #0 /homez.xx/teraevol/www/site/test.php(5): DataBase::initializeConnexion() #1 {main} thrown in /homez.xx/teraevol/www/site/includes/database.inc.php on line 65
Je ferme bien les connexions avant la fin du script ($pdo = null) et je n'ouvre qu'une seule connexion (classe statique "DataBase" initialisée une unique fois au début du script).

Pour vous donner une petite idée de l'architecture du serveur :
http://www.ovh.com/fr/produits/eg_best_of.xml
Un serveur de jeu tourne aussi sur le serveur. C'est la base de données de ce serveur que j'essaye d'atteindre.
PHP 5.3 (testé sous PHP 5.2.3 aussi : même résultat).

Auriez-vous une idée du pourquoi du comment je n'arrive pas à me défaire de ces erreurs de connexion malgré la configuration plus que correcte ?

Petite précision, lorsque je tape SHOW PROCESSLIST, je n'ai qu'une dizaine de processus...

Je vous remercie !
Drackster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 15h08   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
c'est inutile de faire $pdo = null à la fin du script,
au niveau de mysqli il faut faire un mysqli_kill + mysqli_close
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 15h26   #3
Invité de passage
 
Inscription : décembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 24
Points : 2
Points : 2
Ce n'était qu'un test avec mysqli.
En production j'utilise uniquement PDO.
Drackster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 14h06   #4
Rédacteur/Modérateur
 
Avatar de Thes32
 
Homme
Développeur Web
Inscription : décembre 2006
Messages : 2 335
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2006
Messages : 2 335
Points : 3 774
Points : 3 774
Salut,

tu peux éviter de créer plusieurs connexions mysql, en adoptant des patterns qui permettent d'avoir une seul connexion pour tous les utilisateurs(un singleton par exemple).
__________________
Développeur | Zend Certified Engineer

Étapes Pour mieux se servir du forum:
1. Commencez par lire les cours et tutoriels ;
2. Faites une recherche;
3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

Nix>_Rien n'est plus pratique que la théorie
Thes32 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 08/03/2011, 15h16   #5
Invité de passage
 
Inscription : décembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 24
Points : 2
Points : 2
J'utilise déjà un Singleton pour ma classe DataBase.

Comment peut-on enregistrer la connexion pour qu'elle soit réutilisée entre deux utilisateurs ? La classe PHP est bien censé être détruite à la fin de l'exécution du script ?!
Drackster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 15h55   #6
Rédacteur/Modérateur
 
Avatar de Thes32
 
Homme
Développeur Web
Inscription : décembre 2006
Messages : 2 335
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2006
Messages : 2 335
Points : 3 774
Points : 3 774
Peut-on voir ta classe PHP ? Le mécanisme de cache fichier statique réduit également les connexions à la base de données.
__________________
Développeur | Zend Certified Engineer

Étapes Pour mieux se servir du forum:
1. Commencez par lire les cours et tutoriels ;
2. Faites une recherche;
3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

Nix>_Rien n'est plus pratique que la théorie
Thes32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 16h00   #7
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
Citation:
Envoyé par Drackster Voir le message
Bonjour,
Lorsque le site atteint à peine ~200 visiteurs simu, il commence à ramer et à afficher des erreurs internes à foison. [...]

Un serveur de jeu tourne aussi sur le serveur. C'est la base de données de ce serveur que j'essaye d'atteindre.
Il faut peut être aussi regarder du coté de ce site, peut être ouvre il trop de connexion.

Note tout de même que 350 connexion mysql simultané sur ton type de serveur n'est pas énorme.
Avec la quantité de ram que tu as tu dois pouvoir doublé ce chiffre sans aucun problème.

Cf doc mysql :
Citation:
Linux or Solaris should be able to support at 500 to 1000 simultaneous connections routinely and as many as 10,000 connections if you have many gigabytes of RAM available and the workload from each is low or the response time target undemanding
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 16h33   #8
Invité de passage
 
Inscription : décembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 24
Points : 2
Points : 2
Je veux bien, mais lorsque j'ai des erreurs Too many connections, je n'ai qu'à peine 5 ou 6 connexions sur l'utilisateur distant.

Je mettrais ma classe ce soir, là je ne peux pas.

Je me suis aperçu que le problème pouvait venir du mutualisé, j'ai mis le script sur un serveur dédié ou en local, et je n'ai aucun soucis. Changement de position donc, ce sont les serveurs mutualisés qui buggent, mais d'où pourrait venir ce problème ?

Note: je dis les serveurs mutualisés, car j'ai testé sur 1&1 et OVH et le problème est le même.
Drackster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 21h29   #9
Invité de passage
 
Inscription : décembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 24
Points : 2
Points : 2
Voici le script de ma base de données, comme promis, fait de tête car je ne pourrais pas l'avoir sous la main avant très certainement après demain :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private static $instance;
private $connexions;
 
public static function getInstance()
{
	if ($this->instance == null)
		$instance = new DataBase();
 
	return $instance;
}
 
public function getConnexion()
{
	if (!isset($this->connexions))
	{
		$this->connexions = Array(
			"DB1"	=> new PDO(...),
			"DB2"	=> new PDO(...)
		);
	}
 
	return $this->connexions;
}
Drackster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 23h59   #10
Membre du Club
 
Inscription : septembre 2002
Messages : 63
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 63
Points : 47
Points : 47
Par défaut SQLSTATE[08004] [1040] Too many connections

Bonjour,

Je sais que ce post a quelques mois déjà, mais je suis en train de me battre avec OVH pour un problème d'erreur MySQL Too many connections (1040).

J'ai plusieurs sites chez OVH avec des erreurs aléatoires de ce type, alors qu'il n'y a qu'un seul visiteur.
J'utilise Zend_Db pour accéder aux tables, donc normalement 1 seule connexion.

J'ai testé sur une base de développement en mettant max_connections à 1 sans jamais avoir le problème.

Avez-vous réussi à régler vote problème ?

Cdt,
Eric.
Eric Pasquier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 00h25   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
c'est a toi de bien gérer ton appli, utilise les connexions persistantes et un système de cache
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 11h13   #12
Membre du Club
 
Inscription : septembre 2002
Messages : 63
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 63
Points : 47
Points : 47
Bonjour,
Merci de votre réponse.

Comme indiqué, j'utilise le composant Zend_Db du Zend Framework qui est un singleton.
J'ai fait l'essai sur une base de développement de configurer un serveur MySQL avec max_connections=1 sans jamais avoir le problème.

J'ai aussi fait l'essai d'essayer d'ouvrir plusieurs connexions dans un même script php, ce qui est impossible avec la fonction mysql_connect si la base et l'utilisateur est le même à chaque connexion (voir doc mysql_connect).

Autre chose qui me titille.
Le message Too many connection (1040) est fait pour le paramètre max_connections. Pour le paramètre max_user_connections, il est différent :
Code :
User eric already has more than 'max_user_connections' active connections
Je ne sais pas comment est configuré le serveur MySQL en hébergement mutualisé chez OVH, mais je ne comprends pas qu'ils me disent que c'est le paramètre max_connections qui est à 10, alors que personnellement, je pense que c'est max_user_connections.

Enfin, c'est un phénomène très aléatoire, qui se produit alors qu'il n'y a qu'un seul visiteur; le problème dure alors entre 30s et 60s, me faisant plus penser à une charge ponctuelle du serveur en terme de nombre TOTAL de connections et non pas d'un problème applicatif. A titre indicatif, le dernier problème remonte à plusieurs jours, alors que le site est toujours opérationnel.

Qu'en pensez vous ?

Cdt,
Eric.
Eric Pasquier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 19h06   #13
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 800
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 800
Points : 1 512
Points : 1 512
Serveur mutualisé... Et cela ne vous met pas la puce à l'oreille ? ^^
Il n'y a pas que le serveur web qui est mutualisé, mais aussi le sgbd...
Donc c'est 350 connexions répartis sur l'ensemble des sites hébergés ! (et pas que les votres)

Alors franchement 350 connexions s'il y a une dizaine de site je changerai directement de plateforme pour ma part.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h37.


 
 
 
 
Partenaires

Hébergement Web