MySQLiと比較したPDOに関しては、かなり単純な質問です。
MySQLiを使用すると、接続を閉じるために次のことができます。
$this->connection->close();
ただし、PDOでは、次を使用して接続を開くことを示しています。
$this->connection = new PDO();
ただし、接続を閉じるには、null
に設定します。
$this->connection = null;
これは正しいですか、これは実際にPDO接続を解放しますか? (null
に設定されているので、それを知っています。)MySQLiでは、関数(close
)を呼び出して接続を閉じる必要があります。 PDOは= null
と同じくらい簡単に切断できますか?または、接続を閉じる機能はありますか?
ドキュメントによると、あなたは正しいです( http://php.net/manual/en/pdo.connections.php ):
接続は、そのPDOオブジェクトの有効期間中アクティブのままです。接続を閉じるには、オブジェクトを破棄する必要があります、残りのすべての参照が削除されていることを確認してください-これを行うには、変数にNULLを割り当てますオブジェクトを保持します。これを明示的に行わない場合、PHPはスクリプトの終了時に自動的に接続を閉じます。
PDOオブジェクトを永続的な接続として初期化しても、接続は自動的に閉じられないことに注意してください。
$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.
「$ 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);
接続を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;