Pg close: примеры (PHP)

Закрытие подключений PostgreSQL через pg_close
Раздел: Базы данных (PostgreSQL)
pg_close(?PgSql\Connection $connection = null): bool

Функция pg_close в PHP

Описание

Функция pg_close() закрывает непостоянное соединение с базой данных PostgreSQL. Эта функция освобождает ресурсы, связанные с соединением.

Когда используется

Функция применяется для явного закрытия соединения с базой данных, когда оно больше не требуется. В типичном сценарии соединение автоматически закрывается при завершении скрипта, но использование pg_close() позволяет освободить ресурсы раньше.

Аргументы

Функция принимает один необязательный аргумент:

  • $connection (ресурс) - ресурс соединения с PostgreSQL. Если аргумент не указан, используется последнее открытое соединение.

Примеры использования pg_close

Простое закрытие соединения
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
// Работа с базой данных
pg_close($conn);
echo 'Соединение закрыто';
?>
Соединение закрыто
Закрытие последнего соединения
<?php
$conn1 = pg_connect("host=localhost dbname=test1 user=postgres");
$conn2 = pg_connect("host=localhost dbname=test2 user=postgres");
// Закрывает $conn2, так как это последнее соединение
pg_close();
// $conn1 остается открытым
?>
Попытка закрыть несуществующее соединение
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
pg_close($conn);
// Повторное закрытие
var_dump(pg_close($conn));
?>
bool(false)

Альтернативные функции в PHP

Неявное закрытие

Соединение закрывается автоматически при завершении работы скрипта. Явный вызов pg_close() не обязателен, но рекомендуется для управления ресурсами.

pg_connect() с параметром PGSQL_CONNECT_FORCE_NEW

Принудительное создание нового соединения даже с идентичными параметрами. Не закрывает предыдущие соединения явно, но позволяет работать с несколькими соединениями одновременно.

Использование PDO

Расширение PDO использует объектно-ориентированный подход. Закрытие соединения происходит при уничтожении объекта PDO или через установку значения null переменной, содержащей объект.

<?php
$pdo = new PDO('pgsql:host=localhost;dbname=test', 'postgres');
// Работа с базой данных
$pdo = null; // Соединение закрывается
?>

Аналоги в других языках

Python (psycopg2)
import psycopg2
conn = psycopg2.connect("host=localhost dbname=test user=postgres")
# Работа с базой данных
conn.close()  # Явное закрытие
Node.js (pg)
const { Client } = require('pg');
const client = new Client({
  host: 'localhost',
  database: 'test',
  user: 'postgres'
});
await client.connect();
// Работа с базой данных
await client.end();  // Асинхронное закрытие
Java (JDBC)
Connection conn = DriverManager.getConnection(
  "jdbc:postgresql://localhost/test", "postgres", "");
// Работа с базой данных
conn.close();  // Явное закрытие
MySQLi в PHP
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
// Работа с базой данных
$mysqli->close();  // Метод close() объекта
?>

Типичные ошибки

Закрытие несуществующего соединения
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
pg_close($conn);
// Дальнейшие операции с закрытым соединением
$result = pg_query($conn, "SELECT 1");
var_dump($result);
?>
bool(false)
Использование ресурса после закрытия
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
pg_close($conn);
if (!pg_connection_status($conn)) {
    echo 'Соединение активно';
} else {
    echo 'Соединение закрыто';
}
?>
Warning: pg_connection_status() expects parameter 1 to be resource, bool given
Передача неверного типа аргумента
<?php
pg_close('not_a_connection');
?>
Warning: pg_close() expects parameter 1 to be resource, string given

Изменения в версиях PHP

PHP 8.0.0

Функция теперь выбрасывает ошибку типа TypeError, если параметр $connection имеет неверный тип. В предыдущих версиях это вызывало предупреждение.

Исторические изменения

В ранних версиях PHP функция всегда возвращала true при успешном закрытии. Сейчас возвращает true только если соединение было действительно открыто и успешно закрыто, иначе false.

Расширенные примеры

Закрытие в обработчике исключений
Пример php
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
try {
    $result = pg_query($conn, "SELECT * FROM non_existent_table");
    if (!$result) {
        throw new Exception('Ошибка запроса');
    }
} catch (Exception $e) {
    echo 'Ошибка: ' . $e->getMessage();
    pg_close($conn); // Гарантированное закрытие при ошибке
    exit;
}
pg_close($conn);
?>
Работа с несколькими соединениями
Пример php
<?php
$conn1 = pg_connect("host=localhost dbname=db1 user=postgres");
$conn2 = pg_connect("host=localhost dbname=db2 user=postgres");

// Закрытие конкретного соединения
pg_close($conn1);

// Проверка статуса
echo 'Соединение 1: ' . (pg_connection_status($conn1) === PGSQL_CONNECTION_OK ? 'Открыто' : 'Закрыто');
echo '\nСоединение 2: ' . (pg_connection_status($conn2) === PGSQL_CONNECTION_OK ? 'Открыто' : 'Закрыто');

pg_close($conn2);
?>
Соединение 1: Закрыто
Соединение 2: Открыто
Использование в пользовательской функции-обертке
Пример php
<?php
function db_query_with_close($sql) {
    static $conn = null;
    if ($conn === null) {
        $conn = pg_connect("host=localhost dbname=test user=postgres");
    }
    $result = pg_query($conn, $sql);
    // Закрытие после каждого запроса (не рекомендуется для частых запросов)
    pg_close($conn);
    $conn = null;
    return $result;
}

$result = db_query_with_close("SELECT version()");
$row = pg_fetch_row($result);
echo $row[0];
?>

PHP pg_close function comments

En
Pg close Closes a PostgreSQL connection