Dans le développement moderne, l'utilisation générale des frameworks nous amènera à ignorer l'encapsulation sous-jacente, et la plupart des frameworks utilisent par défaut PDO pour les opérations de base de données. Alors, savez-vous comment PDO ferme la connexion de données ?
Description officielle
Pour fermer la connexion, vous devez détruire l'objet pour vous assurer que toutes les références restantes à celui-ci sont supprimées. Vous pouvez attribuer une valeur NULL à la variable objet. Si vous ne le faites pas explicitement, PHP fermera automatiquement la connexion à la fin du script.
$pdo = new PDO('mysql:host=127.0.0.1; port=3306; dbname=blog_test', 'root', ''); $pdo = null;
La documentation officielle est très claire, c'est-à-dire qu'il suffit d'attribuer NULL à l'objet PDO. Mais les choses sont-elles vraiment si simples ?
Test réel
Faisons le test comme celui-ci. Dans des circonstances normales, nous ne fermerons pas la connexion à la base de données directement après l'avoir ouverte, mais devrons effectuer certaines opérations.
$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test', 'root', ''); $stmt = $pdo->prepare('SELECT * FROM zyblog_test_user'); $stmt->execute(); $pdo = null; sleep(60);
Après avoir exécuté le code ci-dessus, nous utilisons show full processlist ; dans la base de données pour afficher le processus de connexion. Nous constaterons que la connexion actuelle n'est pas fermée immédiatement, mais ne sera fermée que 60 secondes plus tard, c'est-à-dire après. l'exécution de la page est terminée. Il semble que $pdo = null; ne s'est pas exécuté correctement.
En fait, cette situation a été expliquée dans les documents officiels, mais les gens n'y prêtent peut-être pas attention. [L'objet doit être détruit pour garantir que toutes les références restantes à celui-ci sont supprimées]. Dans le code ci-dessus, la fonction d'instruction SQL précompilée $stmt appelle la méthode dans l'objet $pdo, créant une relation de dépendance de référence entre elles. dans ce cas, donner directement $pdo = null n'a aucun effet, nous devons également attribuer $stmt à null.
$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test', 'root', ''); $stmt = $pdo->prepare('SELECT * FROM zyblog_test_user'); $stmt->execute(); $stmt = null; $pdo = null; sleep(60);
mysqli test
Y aura-t-il donc ce problème lors de l'utilisation du composant d'extension par défaut de mysqli, c'est-à-dire en utilisant close() dans l'objet mysqli pour fermer la connexion à la base de données ? Ou testez-le directement avec du code. (L'extension mysql est obsolète et n'est pas recommandée. Si vous souhaitez encapsuler vous-même la classe d'opération de base de données ou écrire une petite démo, il est préférable d'utiliser mysqli)
$conn = new mysqli('127.0.0.1', 'root', '', 'blog_test'); $result = $conn->query('SELECT * FROM zyblog_test_user'); $stmt = $conn->prepare("SELECT * FROM zyblog_test_user"); $stmt->execute(); $conn->close(); sleep(60);
Après avoir exécuté le code ci-dessus, nous ne verrons pas le processus de connexion dans la base de données Si vous voyez la connexion en cours d'exécution, cela signifie que l'appel de la méthode close() dans mysqli peut directement fermer immédiatement la connexion à la base de données.
Résumé
En fait, le contenu d'aujourd'hui est également l'information contenue dans une note sur le document officiel concernant la connexion à la base de données. Un maître a découvert ce problème il y a longtemps et l'a partagé, mais la plupart des gens ne connaissent pas du tout ce problème, et beaucoup de gens ne savent même pas que PDO peut fermer la connexion à la base de données.
Bien que le framework nous apporte de la commodité, il résume si bien beaucoup de choses que de nombreux amis ne se soucient pas du contenu sous-jacent. Cependant, lorsque vous passez à un niveau supérieur, ces contenus sous-jacents peuvent souvent vous gêner.
Apprentissage recommandé : Tutoriel vidéo php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!