Pg connection reset: примеры (PHP)

Сброс соединения PostgreSQL: работа с pg_connection_reset
Раздел: Базы данных (PostgreSQL)
pg_connection_reset(PgSql\Connection $connection): bool
Функция pg_connection_reset в PHP

Функция pg_connection_reset сбрасывает подключение к серверу PostgreSQL. Она закрывает текущее соединение и пытается переподключиться с теми же параметрами, которые использовались изначально. Это полезно при восстановлении после временных сетевых сбоев или при необходимости очистки состояния соединения без создания нового ресурса.

Аргументы функции

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

  • $connection (ресурс PgSql\Connection) — ресурс соединения с базой данных PostgreSQL, возвращаемый функциями pg_connect или pg_pconnect.

Возвращает true при успешном сбросе или false в случае неудачи.

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

Простейший пример сброса соединения:

$conn = pg_connect("host=localhost dbname=test user=postgres");
// Предположим, соединение разорвалось
$result = pg_connection_reset($conn);
if ($result) {
    echo 'Соединение сброшено успешно';
} else {
    echo 'Не удалось сбросить соединение';
}
Соединение сброшено успешно
Проверка работоспособности после сброса

Пример с выполнением запроса после сброса:

$conn = pg_connect("host=localhost dbname=test");
$resetOk = pg_connection_reset($conn);
if ($resetOk) {
    $queryResult = pg_query($conn, "SELECT 1 as result");
    $row = pg_fetch_assoc($queryResult);
    echo 'Результат запроса после сброса: ' . $row['result'];
}
Результат запроса после сброса: 1
Альтернативные функции в PHP

Прямых аналогов pg_connection_reset в PHP нет, но существуют другие функции для управления соединениями:

  • pg_connect — создает новое соединение. Используется, когда нужно полностью пересоздать подключение с новыми параметрами.
  • pg_close — закрывает соединение. Применяется для явного освобождения ресурсов, но не позволяет автоматически переподключиться.
  • pg_ping — проверяет состояние соединения. Подходит для проверки работоспособности без разрыва подключения.

Функцию pg_connection_reset предпочтительнее использовать при необходимости восстановления соединения после сбоя с сохранением исходных параметров подключения.

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

Используется метод reconnect() объекта соединения:

import psycopg2
conn = psycopg2.connect("dbname=test")
conn.close()
# В psycopg2 нет прямой аналогии, обычно пересоздают соединение:
conn = psycopg2.connect("dbname=test")
JavaScript (node-postgres)

Клиент автоматически управляет переподключением, но можно принудительно завершить соединение:

const { Client } = require('pg');
const client = new Client();
await client.connect();
await client.end();
// Переподключение требует нового вызова connect
await client.connect();

Pg connection reset в MySQL

В MySQL используется команда COM_RESET_CONNECTION или изменение через SQL:

-- Нет прямой команды, но можно использовать:
KILL CONNECTION_id;
-- И затем переподключиться
Типичные ошибки
Передача несуществующего соединения
$result = pg_connection_reset(null);
// Генерируется предупреждение и возвращается false
Warning: pg_connection_reset() expects parameter 1 to be resource, null given
Сброс уже закрытого соединения
$conn = pg_connect("host=localhost");
pg_close($conn);
$result = pg_connection_reset($conn); // false
// Возвращает false без явного предупреждения
Отсутствие обработки ошибок
$conn = pg_connect("host=invalid_host");
// Если соединение изначально не установлено, сброс не сработает
$result = pg_connection_reset($conn);
// Возвращает false
Изменения в версиях PHP

Начиная с PHP 8.1, параметр $connection ожидает объект PgSql\Connection вместо ресурса. Передача ресурса вызывает устаревшее предупреждение. В PHP 8.3 существенных изменений в работе функции не было.

// До PHP 8.1
$conn = pg_connect(...); // ресурс
// PHP 8.1+
$conn = pg_connect(...); // объект PgSql\Connection
Расширенные примеры
Автоматическое восстановление соединения
Пример php
function executeQueryWithReset($connection, $sql) {
    $result = pg_query($connection, $sql);
    
    if (!$result && !pg_connection_busy($connection)) {
        // Пытаемся сбросить при ошибке запроса
        if (pg_connection_reset($connection)) {
            $result = pg_query($connection, $sql);
        }
    }
    return $result;
}

$conn = pg_connect("host=localhost dbname=test");
$data = executeQueryWithReset($conn, "SELECT * FROM users");
Комбинирование с pg_connection_status
Пример php
$conn = pg_connect("host=localhost");

// Имитация разрыва (например, перезагрузка сервера БД)
if (pg_connection_status($conn) === PGSQL_CONNECTION_BAD) {
    echo 'Статус: BAD. Пытаемся сбросить...';
    
    if (pg_connection_reset($conn)) {
        echo 'Соединение восстановлено';
        // Теперь статус должен быть PGSQL_CONNECTION_OK
    }
}
Использование в обработчике ошибок
Пример php
set_error_handler(function($errno, $errstr) use (&$connection) {
    if (strpos($errstr, 'server closed the connection') !== false) {
        if (pg_connection_reset($connection)) {
            // Повторяем последнюю операцию
            return true;
        }
    }
    return false;
});
Сброс с последующей проверкой параметров
Пример php
$conn = pg_connect("host=localhost dbname=original_db");
// Меняем базу данных (временное действие)
pg_query($conn, "USE other_db");

// Сброс вернет исходные параметры подключения
pg_connection_reset($conn);

// Теперь соединение снова с original_db
$result = pg_query($conn, "SELECT current_database()");
$db = pg_fetch_result($result, 0);
echo 'Текущая БД после сброса: ' . $db;
Текущая БД после сброса: original_db

PHP pg_connection_reset function comments

En
Pg connection reset Reset connection (reconnect)