7
votes

Utilisation de la connexion de base de données de fermeture dans PHP

J'étais toujours en supposant que c'est toujours une bonne pratique pour fermer la connexion à la base de données, quelle que soit la base de données / orm, comme MySQL_Close (), Propel :: Fermer () etc.

en référence à l'une de mes autres Question et Quelques autres recherches sur Internet, je suis venu de connaître un visage surprenant que la plupart des gens le recommencent que cela n'a pas d'importance si vous fermez la connexion lorsque la connexion est toujours fermée après la demande.

Cependant, je trouve ces réponses peu difficiles à digérer. La raison est que toutes les DB lib, orm fournir une méthode de près? Si c'est là, dans chaque orm / lib , il doit y avoir une bonne utilisation.

Quelqu'un peut-il faire passer une lumière dans quelles circonstances, nous devrions utiliser une méthode de fermeture pour fermer la connexion DB? & Si ces méthodes ne sont pas utiles du tout, pourquoi elles sont présentes dans toutes les libs / orm DB?

Modifier

ma conclusion

Ce fut une bonne discussion entre Bondye et Fluffeh et il a effacé mes doutes sur l'utilisation de la fermeture de la connexion. Merci à tous les deux.

  • Si votre script devrait durer moins de 100 ms, ne vous embartiez pas de la connexion.
  • Mais: Si le script devrait durer plus longtemps et qu'il existe un certain temps entre le dernier fonctionnement de la DB et la fermeture du script, une connexion gratuite pour d'autres en appelant * Fermer ().

    Il est vraiment très difficile pour moi d'accepter une réponse car les deux réponses sont correctes sur sa place. Il suffit d'accepter la réponse avec tous les commentaires afin qu'il reste sur le dessus. Mais +1 aux deux réponses correctes.


0 commentaires

4 Réponses :


6
votes

C'est toujours une bonne pratique pour fermer une connexion de base de données lorsque vous n'en avez plus besoin. Même s'il est fermé automatiquement après la fin du script - cela peut être un autre deuxième ou un nombre de secondes fractionnées plus tard. Si vous n'en avez plus besoin, un utilisateur frappant une page et gaspiller la connexion de la base de données pendant une demi-seconde ne fera pas de différence - mais vingt le faire à la fois est soudainement 10 secondes de connexion ouverte - et que fait faire une différence.

En même temps, la réutilisation d'une connexion peut être une bonne pratique - la fabrication et l'ouverture de la connexion prend normalement au moins quelques millisecondes - et si vous êtes par exemple insérant quelques centaines de milliers de lignes, peu de millisecondes à chaque fois ajoute très vite.

D'une certaine manière, il n'est pas différent de définir une variable à NULL ou de le désautoriser. Vous ne avez-vous pas pour le faire, mais propre code élégant et gestion des ressources est toujours une bonne chose.


2 commentaires

Eh bien, je n'ai jamais eu beaucoup de pensée sur la façon dont les choses se passent en interne à PHP / Zend, mais je suppose que cela est maintenant nécessaire pour mes projets. Quelqu'un peut-il perdre de la lumière sur ce qui est plus coûteux parmi (deux liaison de fermeture de connexion; manuellement et par Zend) et (Laissez la connexion ouverte pour quelques millisecondes / secondes). Je suppose que, mais pas sûr, c'est à propos de la CPU (1 opération de fermeture supplémentaire) VS RAM (un objet de connexion open-open supplémentaire)?


@KAPILSHARMA Je n'ai pas couru des tests sauf quelques cas vraiment évidents dans certains cas, j'écris, mais dans le même temps, il sera probablement différent pour chaque serveur particulier et les ressources qu'il a. Vous pouvez exécuter quelques tests en utilisant Microtime pour voir combien de temps les choses prennent, mais généralement, si vous n'allez plus appeler mySQL, fermez-la. Si votre code prend un moment pour courir entre des déclarations, c'est pourrait une opportunité de fermer - mais mieux à vérifier.



8
votes

Utilisation mysql_close () n'est généralement pas nécessaire, car les liens ouverts non persistants sont automatiquement fermés à la fin de l'exécution du script.

Ressources de libération

Grâce au système de comptage de référence introduit avec le moteur ZEND de PHP 4, une ressource sans plus de références à celle-ci est détectée automatiquement et elle est libérée par le collecteur des ordures. Pour cette raison, il est rarement nécessaire de libérer la mémoire manuellement.

J'espère que cela vous aide à plus.

( source )

EDIT:

Le but de mysql_close () est également d'enregistrer les ressources informatiques, mais une autre raison clé de l'utilisation est du fait qu'il existe un nombre limité de connexions qu'un serveur MySQL peut accepter, et si vous avez Plusieurs clients tenant des connexions ouvertes sans raison, le serveur peut bien vouloir détourner les autres clients en attente. Naturellement, c'est une mauvaise chose, comme avec mysql_free_result () , il est bon d'appeler mysql_close () Si vous pensez qu'il y aura du temps entre votre dernière utilisation de la base de données et votre script se terminant.


5 commentaires

Et si cela est est référencé - mais des conditions (telles qu'une instruction si elle n'est pas encore déterminée) la cause de ne jamais être utilisée? Et si ce chèque est toujours une demi-seconde de temps d'exécution? Ou cinq secondes même? Ne disant pas que vous avez tort, mais cela peut être bon d'utiliser tous les outils donnés à votre meilleur.


Stackoverflow.com/questions/880885/... & Stackoverflow.com/Questtions/336078/...


Du premier (+16) Réponse: Si votre script a une bonne quantité de traitement à effectuer après avoir récupéré le résultat et a récupéré le jeu de résultats complet, vous devez définir la fermeture de la connexion. Si vous ne le faites pas, il y a une chance que le serveur MySQL atteindra sa limite de connexion lorsque le serveur Web est sous une utilisation intensive. C'est exactement Qu'est-ce que je dis que je dis avec Mate.


Voulez-vous fermer la base de données ou désaffecter la mémoire utilisée pour stocker les résultats de la requête? Tuxradar.com/practicalphp/9/4/3


L'OP a posé des questions sur les connexions, je viens d'utiliser une analogie de déséquilibre une variable si nécessaire.



4
votes

Les connexions de base de données ne sont pas illimitées. Les logiciels de base de données commerciaux, en particulier, ont souvent des licences qui limitent le nombre de connexions simultanées à un nombre relativement petit. Dans une telle situation, vous souhaitez absolument fermer la connexion lorsque votre script n'utilise plus activement. Alors que PHP fermez automatiquement la connexion à la base de données lorsqu'un script se termine, il ne le fait pas tant que le visiteur a fini de télécharger la page. Si sa connexion est lente (commutation ou mobile), cela pourrait prendre dix, vingt secondes pour tout ce que vous savez.


1 commentaires

Merci, c'est nouveau point que l'achèvement du script est considéré comme le téléchargement de tous les contenus.



0
votes

Une doctrine comme une doctrine et une propultilité bien développées est bonne à la fermeture des connexions MySQL. Mais si vous utilisez droit PHP, j'ai vu beaucoup de problèmes de base de données suivis à des connexions non récoltées. Il est sage de fermer toutes les connexions DB à la fin de chaque script.


0 commentaires