web-dev-qa-db-fra.com

Connexion de fermeture du PDO

Juste une question assez simple en ce qui concerne PDO par rapport à MySQLi.

Avec MySQLi, pour fermer la connexion, vous pouvez établir:

$this->connection->close();

Cependant, avec PDO, vous indiquez que vous ouvrez la connexion en utilisant:

$this->connection = new PDO();

mais pour fermer la connexion, définissez-la sur null.

$this->connection = null;

Est-ce correct et cela libérera-t-il réellement la connexion PDO? (Je sais que c'est le cas car il est réglé sur null.) Je veux dire avec MySQLi, vous devez appeler une fonction (close) pour fermer la connexion. Le PDO est-il aussi facile que = null de se déconnecter? Ou existe-t-il une fonction permettant de fermer la connexion?

103
Liam Sorsby

Selon la documentation, vous avez raison ( http://php.net/manual/en/pdo.connections.php ):

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 détient l'objet. Si vous ne le faites pas explicitement, PHP fermera automatiquement la connexion à la fin de votre script .

Notez que si vous initialisez l'objet PDO en tant que connexion persistante, il ne fermera pas automatiquement la connexion.

131
Kieran
$conn=new PDO("mysql:Host=$Host;dbname=$dbname",$user,$pass);
    // If this is your connection then you have to assign null
    // to your connection variable as follows:
$conn=null;
    // By this way you can close connection in PDO.
36

J'ai créé une classe dérivée pour avoir une instruction plus auto-documentée au lieu de "$ conn = null;".

class CMyPDO extends PDO {
    public function __construct($dsn, $username = null, $password = null, array $options = null) {
        parent::__construct($dsn, $username, $password, $options);
    }

    static function getNewConnection() {
        $conn=null;
        try {
            $conn = new CMyPDO("mysql:Host=$Host;dbname=$dbname",$user,$pass);
        }
        catch (PDOException $exc) {
            echo $exc->getMessage();
        }
        return $conn;
    }

    static function closeConnection(&$conn) {
        $conn=null;
    }
}

Je peux donc appeler mon code entre:

$conn=CMyPDO::getNewConnection();
// my code
CMyPDO::closeConnection($conn);
4
Fil

C’est plus que la simple définition de la connexion. C'est peut-être ce que dit la documentation, mais ce n'est pas la vérité pour mysql. La connexion restera un peu plus longtemps (j'ai entendu des années 60, mais je ne l'ai jamais testée)

Si vous voulez ici l'explication complète, voir ce commentaire sur les connexions https://www.php.net/manual/en/pdo.connections.php#114822

Pour forcer la fermeture de la connexion, vous devez faire quelque chose comme

$this->connection = new PDO();
$this->connection->query('KILL CONNECTION_ID()');
$this->connection = null;
0
Jdahern