Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi fermons-nous le résultat dans Mysqli

Votre vérification si la connexion a échoué passe par le code qui utilise la connexion. Évidemment, cela ne fonctionnera pas car ce n'est pas une connexion en direct. Assurez-vous que si la connexion échoue, le code qui en dépend n'est pas atteint. (Notez que je ne préconise pas nécessairement l'utilisation de la sortie ou de la mort. Ils peuvent créer une expérience utilisateur plutôt mauvaise. Ils peuvent être utiles, mais idéalement, vous devriez générer un meilleur message et laisser les affreux trucs d'erreur pour les journaux [sauf si vous' ne fais que tester ou c'est un script de ligne de commande]).

Quant à close() (qui est en fait un alias pour free()) :

free() libère essentiellement tous les éléments attachés au résultat. Vous devez comprendre qu'il existe deux manières (simplification, mais allez-y) de récupérer des lignes :

Buffered - Tout est arraché en une seule fois. En d'autres termes, au moment où vous commencez à parcourir les enregistrements, ils sont tous déjà en mémoire. Ils sont tamponnés . Ils ne sont pas extraits du serveur chaque fois que vous appelez fetch(), mais sont plutôt extraits de la mémoire.

Non tamponné - il peut y avoir un petit tampon, mais essentiellement chaque fois que vous appelez fetch(), PHP doit extraire une nouvelle ligne de la base de données. Au début de la boucle, ils ne sont pas tous en mémoire.

Remarque intéressante :num_rows() peut être appelée très efficacement sur une requête mise en mémoire tampon puisque toutes les lignes sont déjà extraites (bien que vous ne devriez jamais extraire toutes les lignes juste pour les compter – c'est à cela que sert COUNT). Les requêtes non mises en mémoire tampon ne peuvent pas exécuter num_rows() tant qu'elles n'ont pas extrait toutes les lignes. Cela signifie qu'il s'agira soit d'une erreur, soit de la transformer essentiellement en une requête mise en mémoire tampon.

Quoi qu'il en soit, revenons à votre question :

free() libère tout ce qui est associé à l'objet résultat. Dans le cas d'une requête en mémoire tampon, il s'agit de toutes les lignes en mémoire. Dans le cas d'une requête non mise en mémoire tampon, free() libérera toutes les lignes éventuellement en mémoire, puis annulera le reste de la requête. Fondamentalement, PHP dit à MySQL :"Hé, vous connaissez toutes ces lignes que je demande ? J'ai changé d'avis. Vous pouvez simplement supprimer cette demande."

Quant à savoir si vous devriez libérer les résultats... Eh bien, chaque fois que la variable sort de la portée*, cela se produira de toute façon. Il n'y a cependant aucun mal à le faire explicitement, et dans les situations où une requête peut utiliser beaucoup de mémoire, puis une autre requête après qu'elle utilise beaucoup de mémoire, vous souhaiterez peut-être libérer les ensembles juste pour garder l'utilisation de la mémoire faible .

* Ou peut-être lorsque la demande se termine. Je ne me souviens pas du haut de ma tête.