Plantage serveur a cause de requettes ?

Résolu
Anthotill Messages postés 127 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 13 mars 2010 - 13 déc. 2005 à 19:48
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 - 21 déc. 2005 à 14:46
Bonjour à tous !

J'ai un probleme avec un site, il mange toute la mémoire RAM d'un serveur web est le fait planter.

J'aurais aimé savoir ce qui pouvais conduire a se résultat, je me demandais si lorsque l'on oublie plusieurs fois de fermer la connexion a Mysql (mysql_close()) ca pouvais saturer la RAM d'un serveur à un point qu'il plante ?

Merci :)

Antho
A voir également:

60 réponses

FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
15 déc. 2005 à 12:35
mysql_free_result() s'utilise avec un argument qui est la ressource que tu veux libérer de la mémoire.
3
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
15 déc. 2005 à 13:34
le mysql_free_result ce n'est là que pour vider la mémoire au cas où t'en aurais besoin ensuite dans le script, (en gros si mettons t'as 8 Mo par script, que ta requête te bouffe 5 Mo et que t'as besoin de 4 Mo ensuite, bah tu fais un mysql_free_result($requete) pour te libérer les 5 Mo bouffés précédemment, mais si t'en as pas besoin bah tu ne mets pas de free result car la mémoire sera libérée à la fin du script).

a +

3
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
15 déc. 2005 à 14:01
Heu ==>
$sql = 'SELECT ...'; c'est pas une ressource chez moi, mais une chaine !!

$req = mysql_query(); ca c'est une ressource !
Quand je parle de libérer une ressource, je parle d'un retour de query.
3
pichpoich Messages postés 26 Date d'inscription lundi 5 janvier 2004 Statut Membre Dernière intervention 29 janvier 2009
16 déc. 2005 à 09:38
[font=Lucida Console]
Une boucle infinie, c'est un calcul que tu fais faire en boucle et qui n'a pas de condition de sortie, ce qui fait que la machine effectue un calcul qui ne ne s'arrete jamais.
il n'y a pas que les while qui peuvent faire une boucle infinie, il y a aussi les for. Par exemple :
for($i=5;$i>=0;$i++)
{
//instruction
}
va faire une boucle infinie car $i s'incrémente de +1 à chaque boucle et la condition de sortie est que $i doit rester positif, ce qui est toujours le cas, donc le calcul ne s'arretera jamais, c'est une boucle infinie.
Bon, l'exemple est en carton, c'est le résultat d'une erreur de programation, là il aurait fallu écrire (par exemple, il y a plusieurs solutions):
for($i=5;$i>=0;$i--)
{
//instruction
}
alors il va falloir que tu te cogne toutes les boucles pour voir si les conditions de sortie sont bonnes ou voir comment sortir d'une boucle (mais là je ne peut pas grand chose pour toi, je suis moi-même un peu limite dans ce domaine).
Salut
Console
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
16 déc. 2005 à 09:51
Une boucle infinie, tu t'en rendrais compte je pense .

Comme son nom l'"indique, une boucle infinie est...infinie. Donc elle ne rend jamais la main. Au bout d'un moment, le script s'arrête à cause du timeout de php.

Bref, tu aurais une erreur fatale avec un time out.

Par contre, une boucle sur tout une page, ça fait long. Il se peut que tu aies des boucles très longues, avec des traitements lourds.
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
16 déc. 2005 à 09:56
Heu...ton script est abhérant.
<form...>
<select...>
<option value="">Faites votre choix</option>
<?php
$requete = mysql_query ('SELECT...');
while ($res = mysql_fetch_assoc ($requete)) {
echo '<option value="',$res['nom_champ1'],'">',$res['nom_champ2'],'</option>';
}
?>
</select>
</form>
suffirait amplement.
3
pichpoich Messages postés 26 Date d'inscription lundi 5 janvier 2004 Statut Membre Dernière intervention 29 janvier 2009
16 déc. 2005 à 10:06
Il me semble que : $ligne = mysql_fetch_array($req1) dansfor ($cpt 0; $ligne mysql_fetch_array($req1); $cpt++)
{
$tab[$cpt]['id'] = $ligne['id'];
$tab[$cpt]['categorie'] = $ligne['categorie'];
$tab[$cpt]['total'] = $ligne['total'];
}
ne soit pas une condition de sortie valable car c'est $cpt qui est initialisé à 0 et qui s'incrémente de +1, mais la condition de sortie $ligne = mysql_fetch_array($req1) ne fait aucune référence à $cpt (peut-être n'est-ce pas obligatoire remarque), par contre il me semble qu'on doit s'attendre à un nombre alors que mysql_fetch_array ne sort pas un nombre mais un tableau indexé sur les nombres en cas de mysql_fetch_array($res2,MYSQL_NUM) et indexé sur les noms de champs en cas de mysql_fetch_array($res2,MYSQL_ASSOC).
Bon, étant matheux à la base, je réagis peut-être trop comme tel et donc pour moi un boucle for n'a que des nombres comme références, mais peut-être que je me trompe.
A plus.
3
pichpoich Messages postés 26 Date d'inscription lundi 5 janvier 2004 Statut Membre Dernière intervention 29 janvier 2009
16 déc. 2005 à 14:10
Et si tu essayais :
$cpt=0;
While ($ligne = mysql_fetch_array($req1))
{
$tab[$cpt]['id'] = $ligne['id'];
$tab[$cpt]['categorie'] = $ligne['categorie'];
$tab[$cpt]['total'] = $ligne['total'];
$cpt=$cpt+1;
}
au lieu de
for ($cpt 0; $ligne mysql_fetch_array($req1); $cpt++)
{
$tab[$cpt]['id'] = $ligne['id'];
$tab[$cpt]['categorie'] = $ligne['categorie'];
$tab[$cpt]['total'] = $ligne['total'];
}
la boucle s'aretterait dés qu'il n'y a plus de ligne à lire sans que tu ais besoin de calculer le nombre d'itérations, et tu aurais quand même des valeurs pour $cpt, non ?
à plus.
3
pichpoich Messages postés 26 Date d'inscription lundi 5 janvier 2004 Statut Membre Dernière intervention 29 janvier 2009
16 déc. 2005 à 17:28
$cpt=0;
while($ligne = mysql_fetch_array($req1))
{
tab[$cpt]['id'] = $ligne['id'];
$tab[$cpt]['categorie'] = $ligne['categorie'];
$tab[$cpt]['total'] = $ligne['total'];
$cpt=$cpt+1;
}


Normalement ça devrait aller mieux
3
Anthotill Messages postés 127 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 13 mars 2010
13 déc. 2005 à 22:05
Je suis dans le floux complet c'est pour ca que je m'adresse à vous ....

Je ne sais pas ce qui ne va pas mais il est sur que le code php en question ne referme jamais mysql.

La connexion est ouverte par un include du fichier de connexion à chaque requette et refermé ensuite (quand le mysql close n'est pas oublié) ...

Donc pour vous c'est possible que l'oublie de fermeture peut donner un résusltat comme ca !!...

Antho
0
Anthotill Messages postés 127 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 13 mars 2010
13 déc. 2005 à 23:00
C'est pas un code c'est plusieurs pages de codes ! un site complet ou la déconnexion a Mysql est souvent oubliée et donc quasiement jamais refermé.

Dans toute les pages, la valeur de MYSQL SELECT c'est * peut etre que ca aussi ca jou lorsqu'ensuite on oubli de refermer Mysql.

Antho, quand tu dis buffers, c'est quoi qui utilise le buffer ?

Antho
0
Anthotill Messages postés 127 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 13 mars 2010
13 déc. 2005 à 23:22
Tous le site utilise des requettes simple :

<?php
include ('connexion.php');
$sql = "SELECT * FROM site ORDER BY `annee` DESC";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
while($data = mysql_fetch_assoc($req))
{
echo '[articles.php?annee=',$data['annee'],' ',$data['annee'],'] - ';
}
?>
<?php mysql_close(); ?>

Il faudrais mieux ouvrir la connexion en haut de page et la fermer en bas plutôt qu'a chaque requette ?
Il faut aussi remplacer les SELECT * par SELECT id,titre,date par exemple ?

Qu'en pensez vous ?

Antho
0
Anthotill Messages postés 127 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 13 mars 2010
14 déc. 2005 à 04:52
OPk do,nc une seul connexion par page, mes requettes et une déconnexion une fois les requettes chargée alors !

Jvé essayé déja de voir ca.

Vous avez d'autre combine pour fluidifier le code ? (ne me demandez pas quoi, je prendrais toutes les idée bonnes à prendrre :p)

Antho
0
Anthotill Messages postés 127 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 13 mars 2010
14 déc. 2005 à 05:16
PS: quand j'aurais les pages en ma possession je vous en copirais une ;)

Antho
0
Anthotill Messages postés 127 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 13 mars 2010
14 déc. 2005 à 13:08
Bonjour!

Malalam, la base est moyenne je dirais ... il y a en tout 7 tables (pour le site sans le forum) avec en moyenne 15 champs ...

Pour le Mysql close, l'hébergeur ma dit d'ouvrir la connexion a chaque début de page et de la refermer a chaque fin de page.

Jutilise les sessions phpbb en début de page, donc une connexion a la BD est déja ouverte. En ce sens, voici le message de l'hébergeur :

"Toutes ces fonctions se trouvent dans le fichier forum/db/mysql.php


Dans ce cas, les corrections à apporter sont les suivantes :


-Supprimer toutes le connexions à la base de données + les mysql_close()


-Remplacer les mysql_query() par $db->sql_fetchrow


-Remplacer les mysql_error() par $db->sql_error()


-Remplacer les mysql_fetch_assoc() et mysql_fetch_array() par $db->sql_fetchrow()


-Ajouter un $db->sql_close() en fin de page

"

Les "->" je ne les comprend pas du tout! c'est des shorts tag ? un peux vieux ? vous me conseillez de faire comment ?

Antho
0
Anthotill Messages postés 127 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 13 mars 2010
14 déc. 2005 à 13:26
En gros, je dois changer mes requettes :

$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
while($data = mysql_fetch_assoc($req))
{

par

if( !$result = $db->sql_query($sql) ) {
die('Erreur SQL !
'.$sql.'
'.$db->sql_error());
}
while( $data = $db->sql_fetchrow($result) )
{

J'ai bien compris ?

Vous pensez que ca évitera de planter le serveur tout ca ?

Antho
0
Anthotill Messages postés 127 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 13 mars 2010
14 déc. 2005 à 13:48
Ok FHX j'ai plus qu'a reprendre toutes les pages :)

Je vous tiens au courant si ca vous interesse :)

Antho
0
Anthotill Messages postés 127 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 13 mars 2010
14 déc. 2005 à 14:24
Salut pichpoich

Je ne comprend pas le résultat du code ! ya pleins de parametres, lesquels m'interresse ?

Antho
0
Anthotill Messages postés 127 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 13 mars 2010
14 déc. 2005 à 18:29
Antho ca pose un prob si je fais un include du fichier de connexion tout en haut de ma page avant même le code HTML ? car je sais pas utiliser les header alors je vais faire comme ca si ca fonctionne...

Antho
0
Anthotill Messages postés 127 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 13 mars 2010
14 déc. 2005 à 18:53
loool merde alors !

Mais je l'inclus ou ma connexion ??? lool

Antho
0
Rejoignez-nous