Connections volatiles

Connections volatiles - PHP - Programmation

Marsh Posté le 20-08-2003 à 10:26:31    

Bonjour à tous, j'espère que je ne commets pas de bourdes pour mon premier message sur ce forum.
 
J'ai un problème assez fun avec PHP :  
Je créée une connection de manière très classique mysql_connect.
Cependant, je remarque qu'après quelques query, les requêtes arrêtent de renvoyer des résultats.
En ouvrant moults connections régulièrement, ca passe un peu mieux...
cependant je trouve ca répugnant dse devoir ouvrir une connection dans une fonction appelée un peu plus de 100 fois dans une page.
 
J 'ai essayé avec mysql_pconnect, et ca marche bien, mais le soucis c est que je ne sais pas comment fermer cette connection après l'avoir ouverte (ce qui fait pas mal de threads permanants dans phpmyadmin après quelques tests).
 
Donc si quelqu'un connait une raison qui empeche les connections de "s'éterniser" suffisamment longtemps, je suis preneur... au point ou j en suis, j accepte a peu près toute aide (vaudou, sorcellerie, mais de préférence connaissance).
 
Tsu


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le 20-08-2003 à 10:26:31   

Reply

Marsh Posté le 20-08-2003 à 10:38:33    

l'utilisation de mysql_pconnect est depprecié ....
 
continue d'utiliser mysql_connect avec création de la connexion et fermeture explicite en fin de script  :)
 
 
si tu en as besoin sur différentes pages tu te fais un header de connexion et un footer de fermeture.  [:spamafote]  
 
quel hébergeur ?


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 20-08-2003 à 10:44:09    

les connexions persistantes sont pas dépréciées :??:  :??:  
 
fais voir ton code, à mon avis tu ouvres trop de connexion et la limite est atteinte ou t'as un bug de programmation car j'ai jamais entendu parler de ce genre de problème


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 20-08-2003 à 11:03:36    

Sh@rdar a écrit :

les connexions persistantes sont pas dépréciées :??:  :??:  
 
fais voir ton code, à mon avis tu ouvres trop de connexion et la limite est atteinte ou t'as un bug de programmation car j'ai jamais entendu parler de ce genre de problème


 

Notez que les connexions persistantes ont quelques inconvénients si vous hébergez une base de données, dont le nombre maximal de connexion risque d'être atteint par les connexions persistantes. Si votre base de données accepte jusqu'à 16 connexions simultanées et que, 17 processus essaient de se connecter, le dernier restera sur la touche. S'il y a des erreurs dans les scripts qui ne permettent pas de fermer la connexion (par exemple, une boucle infinie), votre serveur sera rapidement engorgé. Vérifiez la documentation de votre base de données pour savoir comment elle traite les connexions inactives ou abandonnées.


rien que pour ca il faut extrement être vigilant ... quand on sait que le nombre maximal de requêtes simultanées est de 3 chez OVH.....
 
depprecier .. le mot est peut-être un peu fort et trop généraliste  :whistle:  mais à utiliser prudemment  :)


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 20-08-2003 à 11:09:16    

merci je sais pas ce que c'est qu'une connexion persistante :o  :D


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 20-08-2003 à 11:12:46    

Sh@rdar a écrit :

merci je sais pas ce que c'est qu'une connexion persistante :o  :D  


je sais bien que tu sais ce que sais  :D , je t'expose mes argument s'tout  :o  
et c'est aussi pour l'auteur du tomik  ;)


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 20-08-2003 à 11:13:58    

OK d abord merci pour vos réponses...
alors le nombre d'utilisateurs n est en theorie pas un probleme... je réalise un site intranet qui s'adresse a maximum 7 postes.
Ensuite, le pobleme ne se pose pas a l ouverture d'une connection mais plutot l'inverse : si je n'ouvre et ferme pas 10 connections, et donc que je n'en declare qu'une (car il s agit bien d'une seule et meme connection : meme cible, meme BD), les requetes au bout d'un certain nombre ou temps (je ne sais pas je n ai aps encore reussi a identifier le facteur limitant) ne renvoie plus de result id.
Je peux vous mettre mon code mais c est ... imposant... comptez plus de 1000 lignes de code (c est pour un intranet).
J'estime le nombre de requetes lancées sur cette page à 1500 ou 2000.
 
Tsu


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le 20-08-2003 à 11:16:03    

donne au moins les parties intéressantes et par pitié entre les balises [code ] et [/code ]


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 20-08-2003 à 11:37:34    

<Code>essai </CODE>


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le 20-08-2003 à 11:40:20    

Sh@rdar a écrit :

donne au moins les parties intéressantes et par pitié entre les balises [code ] et [/code ]


 
Ok voila par exemple une des fonctions que j appelle plus de 100fois dans ma page.
On peut constater que j ouvre a chaque fois une nouvelle connection car sinon les premieres requetes s executent puis au bout d'un moment, ne renvoient plus rien... (c est ce qui se passe quand je passe l'identifiant de connection en parametre de la fonction).
 

Code :
  1. function depuis($p1,$p2,$p3,$butoir)
  2. {
  3. $val=0;
  4. $hier = Hier($p1);
  5. $bool=false;
  6. while (!$bool)
  7. {
  8.  if ($hier<$butoir)
  9.  {
  10.   $bool=true;
  11.  }
  12.  else
  13.  {
  14.   $connect = mysql_connect("192.168.1.2", "pagesphp", "ctbtn" ) or die ("Impossible de se connecter\n" );
  15.   mysql_select_db ("Type12" ) or die ("Impossible d'accéder à la base de données\n" );
  16.   $SQL="SELECT * FROM $p3 WHERE date='$hier';";
  17.   mysql_free_result($result);
  18.   $result = mysql_query($SQL,$connect);
  19.   if (mysql_num_rows($result) != 0)
  20.   {
  21.    //journee trouvee
  22.    $bool=true;
  23.    //$SQL = "SELECT * FROM $p3 WHERE date='$hier' AND numBus=$p2;";
  24.    //$r = mysql_query($SQL,$connect);
  25.    while ($tmp=mysql_fetch_row($result))
  26.    {
  27.     if ($tmp[3] == $p2)
  28.     {
  29.      $val = depuis($hier,$p2,$p3,$butoir)+1;
  30.     }
  31.    }
  32.   }
  33.   else
  34.   {
  35.    $hier=Hier($hier);
  36.   }
  37.   mysql_close($connect);
  38.  }
  39. }
  40. return($val);
  41. }


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le 20-08-2003 à 11:40:20   

Reply

Marsh Posté le 20-08-2003 à 11:42:25    

déjà les connexions en boucle tu oublies de suite ça marchera jamais correctement !!
 
donc UNE connexion et XXX requêtes à la rigueur, je jette un oeil et je te dis quoi
 
en plus la fonction est récursive !! oh là là là .... refais entièrement ton analyse c'est du n'importe quoi là


Message édité par Sh@rdar le 20-08-2003 à 11:43:51

---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 20-08-2003 à 11:42:44    

il est stupide d'ouvrir et de fermer 100 fois une connexion au serveur  :pt1cable:  
tu l'ouvres 1 fois, tu fais tes 100 requetes et tu la fermes  [:spamafote]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 20-08-2003 à 11:46:16    

bon alors comme je pige rien à ce que la fonctione doit faire et qu'à mon avis elle doit s'éxécuter quelques centaines de fois sans jamais rien modifier ou mettre à jour j'ai du mal à en saisir l'intérêt...
 
explique nous ce que tu veux faire ça ira beaucoup mieux


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 20-08-2003 à 11:51:06    

Sh@rdar a écrit :

donne au moins les parties intéressantes et par pitié entre les balises [code ] et [/code ]


 
Pour l'architecture de ma page, elle se compose comme suit :
 

Code :
  1. Inclusions. include(...)
  2. Ouverture de page. <HTML>etc..
  3. Ouverture de connection. $link = mysql_connect(...)or die etc...
  4. Requete 1 : recupere X resultats : mysql_query(..., $link);
  5. Pour chaque resultat :
  6. Compte le nombre d occ dans la base de données  : mysql_query(..., $link);
  7. Compte depuis combien de jour il est notifié dans ces résutlats(requete dans fonction recursive donc jusqu'a 30 requetes) : mysql_query(..., $link);
  8. fermeture de connection. mysql_close($link);
  9. ouverture de connection. $link = mysql_connect(...)
  10. Requete 2 : recupere N resultats. mysql_query(...)
  11. //meme traitement que pour precedemment
  12. etc...


Comme ca on a 11 requetes qui en engendre une bonne kyrielle d'autres.
Et si je n ouvre et ferme pas les connections comme montré ci dessus, les requetes ne renvoient pas de résultat.
Et ce meme si je mets des mysql_free_result sur mes resultats après utilisation.
 
 :pt1cable:  
 
Cela dit si vous voulez que je mette mes vrais morceaux de code ... je le ferai mais je n'en vois pas la réelle utilité, a partir du moment ou j'ai essayé sans l'étape  
fermeture connection
ouverture connection  
et que ca ne fonctionnait plus.
Et il en va de meme pour les fonctions appelées : si je n'ouvre pas une connection dedans, il calcule bien le premier résultat, mais ne calcule aucun des autres, faute de résultat des requêtes.
 
Merci de votre aide, parce que la franchement... :pt1cable:  :pt1cable:  


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le 20-08-2003 à 11:52:48    

simogeo a écrit :

il est stupide d'ouvrir et de fermer 100 fois une connexion au serveur  :pt1cable:  
tu l'ouvres 1 fois, tu fais tes 100 requetes et tu la fermes  [:spamafote]  


 
Tu vois simogeo t as tout a fait compris le probleme :
Je souhaite faire comme tu dis mais ca ne fonctionne pas.
Tandis que comme ca c est la seule maniere que j ai trouvé de la faire fonctionner.


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le 20-08-2003 à 11:56:42    

Sh@rdar a écrit :

bon alors comme je pige rien à ce que la fonctione doit faire et qu'à mon avis elle doit s'éxécuter quelques centaines de fois sans jamais rien modifier ou mettre à jour j'ai du mal à en saisir l'intérêt...
 
explique nous ce que tu veux faire ça ira beaucoup mieux


 
Shardar,
la fonction depuis va chercher pour un jour donné dans ma base de données si un de mes éléments (des bus) a été reporté.
Si c est le cas, je sais qu'il a été mentionné aujourd'hui et hier...
S'il a été mentionné hier, alors, je regarde avant hier..; etc...
cependant le probleme ici était que je n'ai aps de résultat pour chaque jour, donc dans le cas ou un jour me manque, je détecte si aucun res n est troouvé ... si c est le cas alors je passe au jour précédent sans arreter ma récursion...
si je trouve de résultats, alors, c est que la journée a été traitée,...
si le bus en question est mentionné je continue ma récursion aux jour précédent jusqu'a atteindre mon jour butée, ou que je ne trouve pas le bus mentionné pour un jour traité.
 
En gros la tache ne peut etre que recursive.


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le 20-08-2003 à 11:57:43    

ça serait pas tout bêtement un problème de portée de variable ?
 
t'as bien déclarée en globale la variable qui contient l'identifiant de connexion à la base ? ($connect je crois)
 
tu veux simplifier le problème : fais tout en procédural sans fonctions parce que dans l'état actual jamais ça marchera avec autant de boucles inutiles et des centaines de requêtes
 
à quoi doit servir ton script ??
 
EDIT : plutôt que faire de la récursivité sur les requêtes, ça serait plus logique de choper d'abord un max de résultat dans un tableau et de travailler dessus ensuite ? c'est beaucoup moins lourd que ce que tu fais


Message édité par Sh@rdar le 20-08-2003 à 11:59:01

---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 20-08-2003 à 11:59:02    

Tsu a écrit :


 
Tu vois simogeo t as tout a fait compris le probleme :
Je souhaite faire comme tu dis mais ca ne fonctionne pas.
Tandis que comme ca c est la seule maniere que j ai trouvé de la faire fonctionner.


si, ca fonctionne ... mais pour cela il faut que tu passes l'identifiant de connexions (retourné par mysql_connect) en paramètre a ta fonction  ;)


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 20-08-2003 à 11:59:34    

En plus clair, je gere des erreurs reportées sur des bus.
Dans ce cadre, je cherche dans la journée en cours toous les bus avec des erreurs.
Puis pour chaque bus, je compte le nombre d'erreurs et depuis combien de jours je sais qu'il est en erreur.
Et ce pour une 12aine de types d'erreurs.
La fonction que j'ai mis en exemple et qui vous a fait rire est une fonction qui calcule le nombre de jours d'erreurs (il genere des erreurs depuis n jours archivés.)
 


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le 20-08-2003 à 12:00:26    

simogeo a écrit :


si, ca fonctionne ... mais pour cela il faut que tu passes l'identifiant de connexions (retourné par mysql_connect) en paramètre a ta fonction  ;)  


 
Je l'ai deja essayé simogeo, et il calcule le truc une fois correctement (pour mon premier bus) et après il ne fait plus rien pour tous les bus suivants..


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le 20-08-2003 à 12:03:40    

ben c'est plutôt ta fonction qui déconne alors  [:spamafote]  (ou son appel dans une boucle j'imagine)


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 20-08-2003 à 12:04:34    

ma conclusion finale pour ce truc qui est à mon avis vain en l'état actuel
 
refait ton analyse et pense bien à ceci :
 
plutôt que de boucler des requêtes, arrange toi pour récupérer une liste de jours que tu utiliseras dans un IN() afin de récupérer en une seule fois tous les jours, ou tout les bus ou tout ce que tu veux
 
les intervalles c'est super important et ça sera une des rares solutions pour arriver à faire ton truc sans que ça rame et sans utiliser des dizaines de requêtes inutiles et gourmandes


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 20-08-2003 à 13:47:50    

OK merci pour votre aide... mais juste pour savoir...  
coment on ferme une connection permanente??
 
Je m'adresse surtout a simogeo qui a l air d'avoir du vecu a ce sujet...
 


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le 20-08-2003 à 14:01:25    

Tsu a écrit :


Je m'adresse surtout a simogeo qui a l air d'avoir du vecu a ce sujet...


[:mlc] .. j'ai pas spécialement de vécu mais lorsqu'une web-app est très orienté bdd MySQL et qu'un nombre important d'utilisateurs sont censés s'y connecté alors on prend les devants  ;)  
 
un connexion persistante ne se ferme pas  :)  (pas même avec la fonction close()) .. sa fermeture se gere au niveau du serveur MySQL je pense  [:spamafote]  
mais je te le deconseille vraiment.... trop de connexions persistantes  au serveur ralentissent ses perfs  ;)


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 20-08-2003 à 15:37:07    

OK merci Simogeo...
Je pense cependant que ca peut etre interessant dans mon cas car cela ne s adresse qu a un nombre restreint de personnes.. mais bon je vais qd meme essayer de contourner les fonctions récursives en créant une nouvelle table... cela va dupliquer les données mais bon..
n'empeche que je ne m explique toujours pas pourquoi la connection non persistante que j ouvrais en deb de page se mettait d'un coup d'un seul au milieu de la page a ne plus fonctionnner correctement...
 
Qui vivra verra??
 :ange:  
 :hello:


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le 20-08-2003 à 19:14:28    

Si j'ai bien compris, tu cherches a savoir depuis quand il y a tel problème avec tel bus.
Ca serait pas plus simple de vérifier au moment ou le problème est déclarer si c'est pas déjà le cas la veille?
Il sufit alors d'incrémenter la date de fin du problème quand il existe déjà la veille que de chercher les donné'es de façon récursives.
 
Quand t'auras pleins de données dans tous les sens, ca te fera gagner beaucoup de temps sur le traitement (chôse importante quand on pense que les script php accédé sur un serveur web sont soumis a un time out)
 
 
Au fait concernant le problème actuel.
Si tu mets pas ta conection en variable globale et qu'ensuite, tu dis pas dans les fonctions où tu exécutes tes requêtes que la variable de conection est une variable globale, alors c'est normal que tes requêtes ne veuilles pas s'éxécuter.
Sh@rdar t'avais déjà fait par de cette remarque. ;)

Reply

Marsh Posté le 21-08-2003 à 10:24:30    

omega2 a écrit :

Si j'ai bien compris, tu cherches a savoir depuis quand il y a tel problème avec tel bus.
Ca serait pas plus simple de vérifier au moment ou le problème est déclarer si c'est pas déjà le cas la veille?
Il sufit alors d'incrémenter la date de fin du problème quand il existe déjà la veille que de chercher les donné'es de façon récursives.
 
Quand t'auras pleins de données dans tous les sens, ca te fera gagner beaucoup de temps sur le traitement (chôse importante quand on pense que les script php accédé sur un serveur web sont soumis a un time out)
 
 
Au fait concernant le problème actuel.
Si tu mets pas ta conection en variable globale et qu'ensuite, tu dis pas dans les fonctions où tu exécutes tes requêtes que la variable de conection est une variable globale, alors c'est normal que tes requêtes ne veuilles pas s'éxécuter.
Sh@rdar t'avais déjà fait par de cette remarque. ;)


 
Effectivement c est sur la solution de dupliquer mes données afin d effectuer une table de depuis que je consulte et mets a jour que je me suis rabattu.
 
Pour les opérateurs de portées ce n etait pas le probleme vu que quand j ai essayé de tout faire avec une seule et meme connec, je la passais en param de la fonction.
 
Cela dit j ai effectué la table et effectivement ca gagne un temps monstre (divise par 10 le temps de calcul).
 
Donc mon probleme est résolu d une certaine maniere cependant, je suis un peu vert car je ne sais tjrs pas comment fermer une connection persistante. (sauf dans le cas ou seule la solution que simogeo m a soumise est bien la seule) mais je trouve ca un peu .. debile de faire une connection qu'on ne peut absolument pas fermer.
 
 


---------------
A vaincre sans péril, on triomphe sans gloire
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed