OVH Community, votre nouvel espace communautaire.

Nombre de connexions MySQL simultanées ?


nyx
02/11/2010, 12h21
Bonjour, j'ai récemment atteint 27 connexions simultanées, sans soucis (paramétré pour 40 max)

Actuellement ma fonction globale est :
static $connected;
mysql_connect si non connecté
si requete>3 sec log+kill toute requete>3sec d'execution ( évite les congestions )
$connected=1;return mysql_query;

entre mysql_close et une nouvelle requête, sur la même page .. cela ralentit-il le processus ??
Cad si je rajoute mysql_close à la fin cela force une nouvelle connection à nouveau
+ mysql_free_results a t-il un avantage sur la mémoire ou pas ???

Les screens de mon tuning sql actuel

http://lh4.ggpht.com/_qd4xe6LnLyA/TM...12/sql.bmp.jpg
http://lh3.ggpht.com/_qd4xe6LnLyA/TM.../sql.bmp-1.jpg
http://lh6.ggpht.com/_qd4xe6LnLyA/TM.../sql.bmp-2.jpg

Jeromax
01/03/2004, 10h02
mysql_close() peut prendre en argument l'identifiant de la connexion retourné par mysql_connect
Il est plus propre de fermer la connexion ouverte explicitement.

L.Boggio
26/02/2004, 14h59
David.A écrivait :
mmm, j'ai testé, ça marche pas avec mon code

j'utilise pas exactement les même fonctions, pê est-ce pour ça, mais je suis pas assez "aware" pour voir les différences entre mettons mysql_query et mysql_db_query


le truc que vous donnez :

$requete="select * from matable";
$conn=mysql_connect($serveur,$login,$password);
$result = mysql_db_query($base,$requete) or sendErrorMySQL2($requete);
mysql_close();
while($row = mysql_fetch_array($result)){

mon code qui fonctionne :
$sql = "SELECT * from matable";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
while($data = mysql_fetch_array($req)){

si je rajoute un mysql_close, ça plante

$sql = "SELECT * from matable";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
mysql_close();
while($data = mysql_fetch_array($req)){


quelqu'un voit pourquoi?
D'abord, ceci , concernant mysql_db_query() :
Note : Cette fonction est obsolète, et abandonnée depuis PHP 4.0.6. Ne l'utilisez plus (ou pas!). Alternative recommandée : mysql_select_db() et mysql_query().

Ensuite, savoir pourquoi tu 'plantes'... Dur, car tu ne donnes pas le message d'erreur ;-)
Fait un bout de code simple (une requête simple, genre un select sur 3 enregistrements, puie une boucle qui affiche le résultat), puis donne nous le code (sans les user/pass !!!) et surtout, l'erreur que tu as.

David.A
26/02/2004, 14h53
mmm, j'ai testé, ça marche pas avec mon code

j'utilise pas exactement les même fonctions, pê est-ce pour ça, mais je suis pas assez "aware" pour voir les différences entre mettons mysql_query et mysql_db_query


le truc que vous donnez :

$requete="select * from matable";
$conn=mysql_connect($serveur,$login,$password);
$result = mysql_db_query($base,$requete) or sendErrorMySQL2($requete);
mysql_close();
while($row = mysql_fetch_array($result)){

mon code qui fonctionne :
$sql = "SELECT * from matable";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
while($data = mysql_fetch_array($req)){

si je rajoute un mysql_close, ça plante

$sql = "SELECT * from matable";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
mysql_close();
while($data = mysql_fetch_array($req)){


quelqu'un voit pourquoi?

L.Boggio
23/02/2004, 00h56
David.A écrivait :
ohhh, y'a bon le mysql_close juste avant le while $data!

vous êtes sûrs que ça marche ? (mode super fainéant ON)

en tt cas si ça marche, ça permet effectivement de pas avoir à attendre d'afficher les résultats avant de fermer la connec, ce serait bien!
Ah oui, c'est sur, comme je l'ai dis qques messages plus haut, tu ouvres ta connexion $connex, tu fais ta requête, les résultats sont retournées par le serveur dans une variable $results (qui a une structure de données particulière pour les résultats de DB), tu clos ta connexion $connex, mais les données, elles, sont toujours dans $results.

David.A
23/02/2004, 00h52
ohhh, y'a bon le mysql_close juste avant le while $data!

vous êtes sûrs que ça marche ? (mode super fainéant ON)

en tt cas si ça marche, ça permet effectivement de pas avoir à attendre d'afficher les résultats avant de fermer la connec, ce serait bien!

L.Boggio
23/02/2004, 00h25
mate écrivait :
Je me répond à moi même pour que ca serve à d'autres :

en fait je confondais mysql_close(); et mysql_free_result( );

La séquence est si je ne me trompe pas :
$requete="select * from matable";
$conn=mysql_connect($serveur,$login,$password);
$result = mysql_db_query($base,$requete) or sendErrorMySQL2($requete);
mysql_close();

while($row = mysql_fetch_array($result)){
........

}
mysql_free_result( $result );
Yep, c'est ça !

mate
23/02/2004, 00h04
Je me répond à moi même pour que ca serve à d'autres :

en fait je confondais mysql_close(); et mysql_free_result( );

La séquence est si je ne me trompe pas :
$requete="select * from matable";
$conn=mysql_connect($serveur,$login,$password);
$result = mysql_db_query($base,$requete) or sendErrorMySQL2($requete);
mysql_close();

while($row = mysql_fetch_array($result)){
........

}
mysql_free_result( $result );

L.Boggio
22/02/2004, 20h59
mate écrivait :
J'ai ce problème avec ma base sur un 60gp.
Les requetes de ma page de resultat son assez lourdes

Je ne comprend pas comment faire pour fermer la connexion avant le traitement :
j'ai le code suivant :

$result = mysql_db_query($base,$requete) or sendErrorMySQL($requete);
while($row = mysql_fetch_array($result)){
........

}
mysql_free_result( $result );

sendErrorMySQL() est un fonction qui m'envoie un mail avec l'erreur mysql... et j'en ai pas mal chaque jour
Quand tu utilises mysql_fetch_array, tu n'as plus besoin de ta connexion MySQL; les résultats ont été retournés dans $result, tu n'as plus besoin de ta connexion.
(désolé, j'avais pas vu que tu avais répondu il y a si longtemps, sinon, je t'aurais répondu avant)

Eadeich
22/02/2004, 18h27
ImmersionX
Guilde francophone de jeux en ligne
http://www.immersionx.com

***

Bonjour,

Je trouve ce sujet très intéressant, car il concerne directement le problème que je rencontre sur mon site et mon forum.

***

Vos réponses m'ont permis de mieux comprendre la problématique. Toutefois, lorsqu'il est dit que :

... ceci penalise les sites mal programmés ou utilisant beaucoup des resources...
Je ne suis pas assé familié en programmation pour savoir si il est normal que mon site et mon forum souffre de ce problème.

***

Pour vous donner un aperçue :

Statistique de mon forum InVision : Le nombre maximum d'utilisateurs en ligne simultanément a été de 21

***

J'apprécierais vivement si on connaisseur pourrait rapidement estimer si il est normal que je souffre de ce problème de "connection max" qui est très fréquent sur mon site et mon forum.


Amicalement

mate
13/02/2004, 21h45
L.Boggio écrivait :
De plus, si tu ouvres ta connexion en début de script, et que tu ne la ferme qu'à la fin, cela implique que chaque exécution de ton script prend 1 connexion pendant toute sa durée. Si 4 visiteurs arrivent à peu de temps près en même temps sur ton site, le 4ème aura droit au message d'erreur.

La syntaxe classique est
// traitement
// ouvertude de connexion SQL
// Requête 1
// Requête 2
...
// Requête n
// fermeture de connexion
// traitement des n résultats.
J'ai ce problème avec ma base sur un 60gp.
Les requetes de ma page de resultat son assez lourdes

Je ne comprend pas comment faire pour fermer la connexion avant le traitement :
j'ai le code suivant :

$result = mysql_db_query($base,$requete) or sendErrorMySQL($requete);
while($row = mysql_fetch_array($result)){
........

}
mysql_free_result( $result );

sendErrorMySQL() est un fonction qui m'envoie un mail avec l'erreur mysql... et j'en ai pas mal chaque jour

L.Boggio
13/02/2004, 11h12
stevebrush écrivait :
il est possible avec phpbb de désactiver les connections mysql persistentes :
il suffit de mettre $persistency = false dans /db/mysql.php comme ceci

Code PHP:
function sql_db($sqlserver$sqluser$sqlpassword$database$persistency false
du coup, les connections sont ouvertes et fermées à chaque appel de page... je ne sais pas si ça repousse les limites de l'étranglement. je sais que pour moi, ça ralentit un peu le forum en général, mais au moins, ça répond tout le temps
Les connexions persistentes sont désactivées chez OVH, de mémoire...

stevebrush
13/02/2004, 10h40
il est possible avec phpbb de désactiver les connections mysql persistentes :
il suffit de mettre $persistency = false dans /db/mysql.php comme ceci

Code PHP:
function sql_db($sqlserver$sqluser$sqlpassword$database$persistency false
du coup, les connections sont ouvertes et fermées à chaque appel de page... je ne sais pas si ça repousse les limites de l'étranglement. je sais que pour moi, ça ralentit un peu le forum en général, mais au moins, ça répond tout le temps

znarf
13/02/2004, 05h34
un forum en phpbb avec environs 30 utilisateurs simultané meme bien "tuned" sur un plan 90 ça bug parfois aux heures de pointes.
passé 50 personne simultané c'est plus la peine en heure de pointe ça devient invivable.

ps : Est ce que OVH pense a faire un plan forum ?
ou on pourrais avoir dans les 15 requetes simultané ?voir plus sans avoir a ce payer un serveur ?

L.Boggio
13/02/2004, 01h06
De plus, si tu ouvres ta connexion en début de script, et que tu ne la ferme qu'à la fin, cela implique que chaque exécution de ton script prend 1 connexion pendant toute sa durée. Si 4 visiteurs arrivent à peu de temps près en même temps sur ton site, le 4ème aura droit au message d'erreur.

La syntaxe classique est
// traitement
// ouvertude de connexion SQL
// Requête 1
// Requête 2
...
// Requête n
// fermeture de connexion
// traitement des n résultats.

jv2759
13/02/2004, 00h37
Une fois que le scripte php et terminer, alors il ferme les connection en court.

Mais il est fortement conseillier de fermer ta connection une fois que tu n'en à plus besoin. Car sinon tu laisse la connection ouvert pour rien. Cela allourdi inutilement le scripte.

Il vaux mieux prendre l'habitude de bien fermer les chose une fois que tu n'en à plus besoin. Même si cela marche sans, et même si tu en à besoin jusqu'a la fin du scripte. C'est une bonne abitude à prendre, et bien coder c'est toujours bénéfique à long terme...

mate
12/02/2004, 22h13
Que se passe t'il quand une connexion n'est pas fermée ?
Est-ce que la connexion se ferme à la fin de la page de code ou bien est-ce qu'elle sera fermée ou bout du time-out du script
Merci de votre réponse.

L.Boggio
11/02/2004, 11h34
Au moment du MySQL_Open, il te retournera une erreur, donc, c'est là qu'il faut que tu testes

if $link=MySQL_Open(...)
{
OK, je bosse
}
else
{
Not OK, traitement d'erreur
}

Amnesiak
11/02/2004, 00h57
D'accord, je comprends mieux !

Et à titre informatif, que se passera-t-il exactement au niveau du code lorsqu'une telle condition se produit ?
L'instruction SQL renvoie-t-elle une erreur, où bien est-elle mise en attente jusqu'à ce qu'une connexion soit libre ?

Merci

OVH
09/02/2004, 20h17
Tout depend du type de requete sql. Si vous faites une requete
sql normal c'est à dire qui prend environ 0.1seconde ça veut
dire que vous pouvez faire 10 requêtes sql pendant une
seconde. Avec 3 connexions simultanées vous arrivez donc
à 30 requêtes/seconde.

Si maintenant vous faites une requêtes très lourde de plusieurs
secondes vous ne pourrez en faire que 3.

Vous avez compris: ceci penalise les sites mal programmés ou
utilisant beaucoup des resources (pourqu'une requête sql
prenne beaucoup de temps il faut qu'elle soit énorme). Les
autres sites ont des resources disponibles pour effectuer les
requêtes legères.

HooK
09/02/2004, 20h11
Salut,
Ca veut simplement dire qu'a un moment T, il ne peut y avoir que 3 connexion simultané sur le serveur de mysql.
Beaucoup plus de visiteurs peuvent viviter ton site en même temps car la connexion est temporaire.
Pour optiminé tes scripts je te recommande le schéma suivant:
1 Ouverture de la connexion
2 Execution requete
3 Fermeture connexion
4 Exploitation des resultats

Voilou
@+
HooK

Amnesiak
09/02/2004, 19h32
Bonjour

Quelque chose m'intrigue en voyant les caractéristiques des diverses offres de serveurs mutualisés :

En ce qui concerne la base de données MySQL, je vois : Nombre de connexions simultanées = 3

Cela signifie-t-il que seuls 3 visiteurs peuvent parcourir mon site simultanément ?

D'avance, merci de votre aide