Question

J'utilise MySQL 5.0 pour un site hébergé par GoDaddy (linux).

Je faisais quelques tests sur mon application Web et, tout à coup, j'ai remarqué que les pages rafraîchissaient très lentement. Enfin, après une longue attente, je suis arrivé à une page qui disait quelque chose du type "Erreur MySQL, Trop de connexions ...", et il a pointé vers mon fichier config.php qui se connecte à la base de données.

C’est juste moi qui me connecte à la base de données, pas d’autres utilisateurs. Sur chacune de mes pages, j'inclus le fichier config.php en haut et ferme la connexion mysql à la fin de la page. Il peut y avoir plusieurs requêtes entre les deux. Je crains de ne pas fermer suffisamment les connexions mysql (mysql_close ()).

Toutefois, lorsque j'essaie de les fermer après l'exécution d'une requête, des erreurs de connexion se produisent sur la page. Mes pages sont PHP et HTML. Lorsque j'essaie de fermer une requête, il semble que la suivante ne se connecte pas. Aurais-je besoin d'inclure à nouveau config.php après la fermeture pour me connecter?

Cette erreur m'a fait peur car en deux semaines, environ 84 personnes ont commencé à utiliser cette application Web.

Merci.

EDIT:

Voici un pseudo-code de ma page:

 require_once('../scripts/config.php');

 <?php
    mysql_query..

    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
 ?>
 some html..
 ..
 ..
 ..
 ..
 <?php
   another mysql_query...
 ?>
 some more html..
 ..
 ..
 <?php mysql_close(); ?>

J'ai pensé que de cette façon, chaque fois que la page était ouverte, la connexion était ouverte, puis la connexion était fermée lorsque le chargement de la page était terminé. Ensuite, la connexion s'ouvre à nouveau lorsque quelqu'un clique sur un bouton de la page, et ainsi de suite ...

EDIT:

D'accord, je viens d'avoir GoDaddy au téléphone. Apparemment, avec mon forfait économique, je suis limité à 50 connexions à la fois. Bien que mon problème aujourd'hui se soit produit avec le seul accès du site à moi, ils ont dit qu'ils avaient eu des problèmes de serveur plus tôt. Cependant, vu que je vais avoir 84 utilisateurs pour mon application Web, je devrais probablement passer à "Deluxe", ce qui permet 100 connexions à la fois. Chaque jour, environ 30 utilisateurs accèdent à mon site à la fois. Je pense donc que le nombre de 100 serait un pari plus sûr. Êtes-vous d'accord?

Était-ce utile?

La solution

Les fournisseurs d’hébergement mutualisé autorisent généralement un assez petit nombre de connexions simultanées pour le même utilisateur.

Ce que fait votre code est:

  • ouvrez une connexion au serveur MySQL
  • faire son travail (générer la page)
  • ferme la connexion à la fin de la page.

La dernière étape, à la fin de la page, n'est pas obligatoire : (avec < code> mysql_close du manuel):

  

Utiliser mysql_close () n'est généralement pas   nécessaire, ouvert non persistant   les liens sont automatiquement fermés à la   fin de l'exécution du script.

Notez cependant que vous ne devriez probablement pas utiliser les connexions persistantes de toute façon ...

Deux conseils:

  • utilisez mysql_connect au lieu de mysql_pconnect (vous êtes déjà d'accord)
  • Définissez le quatrième paramètre de mysql_connect sur false (déjà correct pour vous car il s'agit de la valeur par défaut) : (en citant le manuel):
  

Si un second appel est passé à   mysql_connect () avec le même   arguments, aucun nouveau lien ne sera   établi, mais au lieu de cela, le lien   identifiant du lien déjà ouvert   sera retourné.

     

Le nouveau_lien   paramètre modifie ce comportement et   fait que mysql_connect () ouvre toujours un   nouveau lien, même si mysql_connect () était   appelé avant avec le même   paramètres.


Qu'est-ce qui pourrait alors causer le problème?

Vous essayez peut-être d'accéder à plusieurs pages en parallèle (à l'aide de plusieurs onglets dans votre navigateur, par exemple) , ce qui simulera l'utilisation simultanée de plusieurs utilisateurs du site Web?

Si de nombreux utilisateurs utilisent le site simultanément et que le code entre mysql_connect et la fermeture de la connexion prend beaucoup de temps, cela signifie que de nombreuses connexions seront ouvertes en même temps. .. Et vous atteindrez la limite : - (

Néanmoins, comme vous êtes le seul utilisateur de l'application, sachant que vous avez jusqu'à 200 connexions simultanées autorisées, il se passe quelque chose d'étrange ...


Eh bien, pensez à " trop de connexions ". et " max_connections " ...

Si je me souviens bien, max_connections ne limite pas le nombre de connexions que vous pouvez ouvrir sur le serveur MySQL, mais le nombre total de connexions qui peut être ouvert sur ce serveur, par quiconque s'y connectant .

Citation de la documentation de MySQL sur Trop de connexions :

  

Si vous obtenez trop de connexions   erreur lorsque vous essayez de vous connecter au   serveur mysqld, cela signifie que tous   les connexions disponibles sont utilisées par   autres clients.

     

Le nombre de connexions autorisées est   contrôlé par le max_connections   variable système. Sa valeur par défaut est   100. Si vous devez prendre en charge plus de connexions, vous devez définir un plus grand   valeur pour cette variable.

Le problème ne vient donc peut-être pas de votre part, ni de votre code (ce qui semble bien, en fait) : il se peut qu'il s'agisse de "juste" Si vous n'êtes pas le seul à vouloir vous connecter à ce serveur MySQL (rappelez-vous, "hébergement partagé") , et que trop de gens l'utilisent en même temps ...

... Et si j'ai raison et que c'est ce , vous ne pouvez rien faire pour résoudre le problème: tant qu'il y a trop de bases de données / d'utilisateurs sur ce serveur et que max_connection est défini sur 200, vous continuerez à souffrir ...


Avant de revenir à GoDaddy, ce serait bien si quelqu'un pouvait valider ce que je viens de dire ^^

Autres conseils

J'ai eu environ 18 mois de traitement de cette question ( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections- erreur / )

Les solutions que j’avais (qui s’appliqueraient à vous) ont finalement été les suivantes:

  1. optimisez la base de données conformément à MySQLTuner .
  2. défragmentez les tables chaque semaine en fonction de cette post

Défragmentation du script bash du message:

#!/bin/bash

# Get a list of all fragmented tables
FRAGMENTED_TABLES="$( mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME
FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND
Data_free > 0` | grep -v '^+' | sed 's,t,.,' )"

for fragment in $FRAGMENTED_TABLES; do
  database="$( echo $fragment | cut -d. -f1 )"
  table="$( echo $fragment | cut -d. -f2 )"
  [ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database;
  OPTIMIZE TABLE $table;" > /dev/null 2>&1
done

Assurez-vous de ne pas utiliser de connexions persistantes. C’est généralement une mauvaise idée.

Si vous avez cela .. Au plus, vous devrez prendre en charge autant de connexions que vous avez de processus Apache. Pouvez-vous modifier le paramètre max_connections?

Êtes-vous complètement sûr que le serveur de base de données vous est entièrement dédié?

Connectez-vous à la base de données en tant que root et utilisez "SHOW PROCESSLIST". pour voir qui est connecté. Dans l’idéal, connectez-le à votre système de surveillance pour afficher le nombre de connexions au fil du temps et alerter s’il en existe trop.

Le nombre maximal de connexions à la base de données peut être configuré dans my.cnf, mais faites attention à ne pas manquer de mémoire ou d'espace d'adressage.

Si vous avez un accès au shell, utilisez netstat pour voir combien de sockets sont ouverts dans votre base de données et d'où ils viennent.

Sous Linux, tapez:

netstat -n -a |grep 3306

Sous Windows, tapez:

netstat -n -a |findstr 3306

La solution pourrait en être une, je l’ai trouvée lors d’un test MCQA, même si je n’ai pas compris lequel des deux a raison!

Définissez ceci dans my.cnf " set-variable = max_connections = 200 "

Exécutez la commande "SET GLOBALmax_connections = 200"

Utilisez toujours la fonction mysql_connect () pour vous connecter au serveur mysql

Utilisez toujours la fonction mysql_pconnect () pour vous connecter au serveur mysql

Les solutions suivantes sont possibles:

1) Augmentez le nombre maximal de connexions en définissant la variable globale dans mysql.

set global max_connection=200;

Remarque: Cela augmentera la charge du serveur.

2) Videz votre pool de connexions comme ci-dessous:

FLUSH HOSTS;

3) vérifiez votre liste de processus et supprimez une liste de processus spécifique si vous n'en voulez aucune.


Vous pouvez vous référer à ceci: -

lien d'article

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top