Nombre de connexions MySQL simultanées ?
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
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.
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.
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 !
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)
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
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
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.
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...
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
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.
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