web-dev-qa-db-fra.com

Les connexions SQL ouvertes avec PDO dans PHP doivent être fermés

Lorsque j'ouvre une connexion MySQL dans PHP avec uniquement les fonctions MySQL intégrées, je fais ce qui suit:

$link = mysql_connect($servername, $username, $password);
mysql_select_db($dbname);
//queries etcetera
mysql_close($link);

Lorsque j'ouvre une connexion avec PDO, cela ressemble à ceci:

$link = new PDO("mysql:dbname=$dbname;Host=$servername",$username,$password);
//prepare statements, perform queries

Dois-je fermer explicitement la connexion comme je le fais avec mysql_connect() et mysql_close()? Sinon, comment PHP sait-il que ma connexion est terminée?

TIA.

62
benjy

Utilisez $link = null pour que PDO sache qu'il peut fermer la connexion.

PHP: Connexions PDO et gestion de la connexion

Une fois la connexion à la base de données établie, une instance de la classe PDO est renvoyée à votre script. La connexion reste active pendant la durée de vie de cet objet PDO. Pour fermer la connexion, vous devez détruire l'objet en veillant à ce que toutes les références restantes à celui-ci soient supprimées. Pour ce faire, vous affectez la valeur NULL à la variable qui contient l'objet. Si vous ne le faites pas explicitement, PHP fermera automatiquement la connexion à la fin de votre script.

76
DreadPirateShawn

PDO n'offre pas une telle fonction à lui seul. Les connexions via PDO sont indirectement gérées via les objets PDO refcount en PHP.

Mais parfois, vous voulez quand même fermer la connexion, quel que soit le nombre de références. Soit parce que vous ne pouvez pas le contrôler, vous en avez besoin à des fins de test ou similaires.

Vous pouvez fermer la connexion Mysql avec PDO en exécutant une requête SQL. Chaque utilisateur pouvant se connecter au serveur Mysql est capable de KILL au moins son propre thread:

/*
 * Close Mysql Connection (PDO)
 */

$pdo_mysql_close = function (PDO $connection) {

    $query = 'SHOW PROCESSLIST -- ' . uniqid('pdo_mysql_close ', 1);
    $list  = $connection->query($query)->fetchAll(PDO::FETCH_ASSOC);
    foreach ($list as $thread) {
        if ($thread['Info'] === $query) {
            return $connection->query('KILL ' . $thread['Id']);
        }
    }
    return false;
};

$pdo_mysql_close($conn);

Documentation Mysql connexe:

Questions Stackoverflow connexes:

13
hakre

Lorsque l'exécution du script PHP est terminée, toutes les connexions sont fermées. De plus, vous n'êtes pas obligé de fermer explicitement votre connexion avec mysql_close().

11
Vexatus

Vous pouvez également limiter vos connexions aux fonctions locales. Ainsi, la connexion est fermée dès que la fonction est terminée.

5
JDelage

Etant donné que $link pour le PDO se voit attribuer un objet, PHP définirait cet objet comme null dès que le script sera exécuté de sorte qu'il ne soit plus un objet. Par conséquent, vous pouvez simplement faire:

$link = new PDO("mysql:dbname=$dbname;Host=$servername",$username,$password);

//prepare statements, perform queries

$link = null;
1
Rob Holland

http://uk3.php.net/pdo

D'après ce que j'ai compris, je ne pouvais pas voir quand même le fermer dans le manuel php, et des exemples de scripts que j'ai rapidement examinés ne fermaient jamais la connexion de toute façon d'après ce que je pouvais voir.

0
pjanaway