Maison >développement back-end >Problème PHP >Comment fermer la connexion avec PDO en PHP
Cet article vous présentera comment fermer la connexion avec PDO en PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
Lorsque nous écrivions l'opération de connexion mysql à la main auparavant, nous utilisions généralement mysql_close() pour fermer la connexion à la base de données. Cependant, 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 ?
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 au. 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 ?
Faisons un test comme celui-ci Dans des circonstances normales, après avoir ouvert la connexion à la base de données, nous ne la fermerons pas directement, mais devrons l'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 visualiser le processus de connexion, nous constaterons que la connexion actuelle n'est pas fermée immédiatement, mais sera fermée après 60 secondes, c'est-à-dire , une fois l'exécution de la page 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);
Il y aura donc ce problème si j'utilise le composant d'extension par défaut de mysqli, c'est-à-dire que j'utilise 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 vérifions le connexion à la base de données Le processus ne verra pas la connexion qui est toujours en cours d'exécution. En d'autres termes, appeler la méthode close() dans mysqli peut directement fermer immédiatement la connexion à la base de données.
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 éléments sous-jacents deviennent souvent votre obstacle.
Code de test :
https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E4%B8%ADPDO%E5%85%B3%E9%97%AD%E8%BF%9E%E6%8E%A5%E7%9A%84%E9%97%AE%E9%A2%98.php
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!