web-dev-qa-db-ja.com

PHPでPDOで開かれたSQL接続を閉じる必要がありますか

PHPの組み込みMySQL関数だけでPHPでMySQL接続を開くと、次のようになります。

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

PDOとの接続を開くと、次のようになります。

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

mysql_connect()およびmysql_close()のように明示的に接続を閉じる必要がありますか?そうでない場合、PHP接続がいつ完了したかをどのようにして知ることができますか?

TIA。

62
benjy

使用する $link = null接続を閉じることができることをPDOに知らせます。

PHP:PDO接続と接続管理

データベースへの接続が成功すると、PDOクラスのインスタンスがスクリプトに返されます。接続は、そのPDOオブジェクトの存続期間中アクティブのままです。接続を閉じるには、オブジェクトへの残りの参照がすべて削除されるようにして、オブジェクトを破棄する必要があります。これを行うには、オブジェクトを保持する変数にNULLを割り当てます。これを明示的に行わない場合、PHPはスクリプトの終了時に接続を自動的に閉じます。

76

PDOは、そのような機能を単独で提供しません。 PDOを介した接続は、PHPのPDOオブジェクトrefcountを介して間接的に管理されます。

ただし、refcountに関係なく、とにかく接続を閉じたい場合があります。制御できないため、テスト目的などで必要な場合。

Mysql PDO との接続を閉じるには、SQLクエリを実行します。 Mysqlサーバーに接続できるすべてのユーザーは、少なくとも自分のスレッドをKILLできます:

/*
 * 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);

関連するMysqlドキュメント:

関連するStackoverflowの質問:

13
hakre

PHPスクリプトの実行が終了すると、すべての接続が閉じられます。また、mysql_close()を使用して接続を明示的に閉じる必要はありません。

11
Vexatus

接続をローカル機能内に制限することもできます。これにより、機能が完了するとすぐに接続が閉じられます。

5
JDelage

$linkはPDOにオブジェクトが割り当てられ、PHPはスクリプトが実行されるとすぐにnullに設定されるため、オブジェクトではなくなります。

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

//prepare statements, perform queries

$link = null;
1
Rob Holland

http://uk3.php.net/pdo

私が収集したものから、私はPHPマニュアルでそれを閉じることはとにかく見ることができませんでした、そして私がすぐに見たスクリプトの例は私が見ることができるとにかく接続を決して閉じませんでした。

0
pjau