JeuWeb - Crée ton jeu par navigateur
utilité de mysql_close() ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : utilité de mysql_close() ? (/showthread.php?tid=993)



utilité de mysql_close() ? - Psykose - 07-05-2008

Salut à tous,
je ne savais pas ou poster ce sujet donc je l'ai fait ici.

J'ai une question toute bête :
Doit-on vraiment toujours mettre un mysql_close() une fois les opérations sur ma bdd terminées ?


RE: utilité de mysql_close() ? - Raoull - 07-05-2008

Oui.

On peut lire sur des articles rétrogrades que mysql_close() est optionel parce que la connexion sera coupée automatiquement une fois l'execution du script terminée.

C'est vrai mais c'est faux.

Je ne connais pas tous les détails techniques (je vais donc dire ça d'une manière très simple), mais sans mysql_close() c'est un systeme de sécurité du serveur qui termine (salement) les connexions. Il en resulte que la durée de connexion est plus longue, que les connexions se multiplient, etc.

De plus, pour libérer la charge du serveur mysql, il faut ouvrir sa connexion le plus tard possible et la fermer le plus tot possible (grace à mysql_close). sinon quand tu auras 1000+ (et je suis généreux) joueurs sur ton jeu, c la panique.

Quand j'ai débuté php sur free.fr, j'avais lu ca aussi, et j'avais viré mes mysql_close() pour éviter une simple commande ... et puis un jour l'admin de free (pour limiter les charges serveur, parce que tlm codait comme un porc) a limité les acces mysql à 1 seul par client. Tout le site HS. Avec mysql_close ct nickel. Ca m'a servi de leçon.

Bref, son utilité : INDISPENSABLE !


RE: utilité de mysql_close() ? - Cartman34 - 07-05-2008

D'après ce que j'en sais d'expérience et de ce que j'ai lu sur le doc officielle, la connexion est automatiquement fermée après la fin du script, tel que le ferait un mysql_close.
Celui-ci est optionnel et ne sert qu'à fermer une connexion si vous n'utilisez pas beaucoup de requetes dans vos pages genre 1 ou 2.
Ceci car il ne sert à rien de garde une connexion ouverte le temps d'un script qui ne l'utilise pas, ce qui N'EST PAS le cas d'un jeu.
Ouvrir, fermer, ouvrir, fermer, ouvrir, fermer...etc une connexion avec la bdd est bien plus lourd.

Si tu as une script proprement organisé, c'est à dire PHP puis HTML(via un systeme de TPL par exemple), tu peux utiliser mysq_close() de manière systématique(avec une fonction qui affiche un TPL par exemple) à la fin de ton script PHP et avant le début de ton HTML.
Cela evite d'occuper la connexion durant un script ou tu es sur de ne pas faire de requete SQL.

Je suis donc obligé de dire, en contredisant mon prédécesseur, que cette fonction n'est que facultative et à utiliser avec précautions !


RE: utilité de mysql_close() ? - Raoull - 08-05-2008

le débat est lancé Smile

IGstaff a écrit :(...) cette fonction n'est que facultative et à utiliser avec précautions !

Mais tu y vas quand même fort...

Si cette fonction existe, c'est pas pour rien. Pour moi ne pas fermer sa connexion, c'est coder comme un sagouin.


RE: utilité de mysql_close() ? - alfanor - 08-05-2008

Il n'y va pas fort, il dit tout simplement ce qu'il y a ... la connexion est automatiquement fermée depuis je ne sais plus quelle version de PHP, mais la fonction est toujours présente si jamais il nous est utile de fermer la connexion au beau milieu d'un script par exemple.


RE: utilité de mysql_close() ? - Raoull - 08-05-2008

C'est une question de connexions simultannées (attendez de voir ds "too many connexion").
Et SURTOUT de propreté. Je comprends pas ... vous faites des flans quand certains n'identent pas leur code, mais pas de problème s'ils ferment pas leurs connexions.
Ou alors je suis vraiment old schoold... En tout cas je trouve vraiment ça très crade.


RE: utilité de mysql_close() ? - naholyr - 08-05-2008

Normalement vous n'avez pas besoin de la connexion pendant toute la durée d'exécution du script.

Faire des "echo" & cie c'est une opération très longue (il faut envoyer les entêtes HTTP, gérer le buffer, et enfin envoyer les premières données). Donc une bonne pratique est :
- Faire ses traitements (dont requêtes)
- Fermer toutes les connexions
- Envoyer les entêtes HTTP
- Envoyer les données

Le temps d'envoi des entêtes et des données au client représente *au moins* la moitié du temps d'exécution d'un script. Imaginons que vous ayez un serveur MySQL configuré pour supporter 4 connexions simultanées, et que votre script ait une durée d'exécution de 1s.

Avec la méthode "je m'en fous je fais tout dans n'importe quel sens et je vous dis crotte", ça donne une durée de connexion à MySQL de 1s pour le script :
- 4 visites sur le script en 1s = OK
- 5e visite sur le script en 1s = échec critique (too many connexions, connection à SQL impossible, boum badaboum).

Avec la méthode "je ferme proprement ma connexion quand j'ai fini de faire mes requêtes", ça donne une durée de connexion à MySQL de 0.5s, et donc on double le nombre de visites simultanées :
- 8 visites sur le script en 1s = OK
- 9e visite = échec critique, mais de toute façon comme Apache est par défaut configuré pour 6 ou 8 connexions simultanées, il faudra optimiser parce qu'Apache risque de dire non avant MySQL Tongue


C'est aussi pour ça qu'on conseille la méthode MVC : on n'envoie aucune entête ni aucune sortie au client tant qu'on n'a pas fini *tous* les traitements. Sans cette pratique, effectivement il est idiot de faire un mysq_close() vu qu'on fait des requêtes dans à peu près tous les fichiers dans un joyeux mélange.


RE: utilité de mysql_close() ? - thelos - 08-05-2008

Thanks naholyr pour tes explications, je vais certainement reprendre cette structure dans mes scripts Wink