web-dev-qa-db-ja.com

接続を閉じるPDO

MySQLiと比較したPDOに関しては、かなり単純な質問です。

MySQLiを使用すると、接続を閉じるために次のことができます。

$this->connection->close();

ただし、PDOでは、次を使用して接続を開くことを示しています。

$this->connection = new PDO();

ただし、接続を閉じるには、nullに設定します。

$this->connection = null;

これは正しいですか、これは実際にPDO接続を解放しますか? (nullに設定されているので、それを知っています。)MySQLiでは、関数(close)を呼び出して接続を閉じる必要があります。 PDOは= nullと同じくらい簡単に切断できますか?または、接続を閉じる機能はありますか?

102
Liam Sorsby

ドキュメントによると、あなたは正しいです( http://php.net/manual/en/pdo.connections.php ):

接続は、そのPDOオブジェクトの有効期間中アクティブのままです。接続を閉じるには、オブジェクトを破棄する必要があります、残りのすべての参照が削除されていることを確認してください-これを行うには、変数にNULLを割り当てますオブジェクトを保持します。これを明示的に行わない場合、PHPはスクリプトの終了時に自動的に接続を閉じます

PDOオブジェクトを永続的な接続として初期化しても、接続は自動的に閉じられないことに注意してください。

127
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.
34

「$ 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;
    }
}

だから私は次の間に私のコードを呼び出すことができます:

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

接続をnullに設定するだけでは不十分です。それはドキュメントが言っていることかもしれませんが、それはmysqlの真実ではありません。接続はもう少し長く続きます(60年代は聞いたことがありますが、テストしたことはありません)

完全な説明が必要な場合は、接続に関するこのコメントを参照してください https://www.php.net/manual/en/pdo.connections.php#114822

接続を強制終了するには、次のようなことをする必要があります

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