Закрытие соединения PDO

Просто довольно простой вопрос относительно PDO по сравнению с MySQLi.

С MySQLi, чтобы закрыть соединение, которое вы могли бы сделать:

$this->connection->close();

Однако с PDO он заявляет, что вы открываете соединение, используя:

$this->connection = new PDO();

но для закрытия соединения вы установите его на null.

$this->connection = null;

Правильно ли это, и действительно ли это освободит соединение PDO? (Я знаю, что он работает, так как он установлен в null.) Я имею в виду, что с MySQLi вы должны вызвать функцию (close), чтобы закрыть соединение. Является ли PDO таким же простым, как = null для отключения? Или есть функция, чтобы закрыть соединение?

Ответ 1

В соответствии с документацией вы правы (http://php.net/manual/en/pdo.connections.php):

Соединение остается активным для времени жизни этого объекта PDO. к закройте соединение, вам нужно уничтожить объект, гарантируя, что все остальные ссылки на него удаляются - вы делаете это, назначая NULL для переменной, которая содержит объект. Если вы этого не сделаете явно, PHP автоматически закроет соединение, когда ваш script заканчивается.

Обратите внимание, что если вы инициализируете объект PDO в качестве постоянного соединения, он не будет автоматически закрывать соединение.

Ответ 2

$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.

Ответ 3

Я создал производный класс, чтобы иметь более самостоятельную документацию, а не "$ 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

Это больше, чем просто установка соединения на ноль. Это может быть то, что говорится в документации, но это не правда для 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;