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

Работа с pg_connection_status для контроля подключения к PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_connection_status(PgSql\Connection $connection): int

Описание функции pg_connection_status

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

Синтаксис и аргументы
int pg_connection_status(resource $connection)

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

  • $connection – ресурс соединения с базой данных PostgreSQL, полученный с помощью pg_connect() или pg_pconnect().
Возвращаемые значения

Функция возвращает одну из предопределенных констант:

  • PGSQL_CONNECTION_OK – соединение активно и работоспособно.
  • PGSQL_CONNECTION_BAD – соединение неактивно, разорвано или возникла ошибка.

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

Проверка успешного подключения
$conn = pg_connect('host=localhost port=5432 dbname=test user=postgres password=pass');
if ($conn) {
    $status = pg_connection_status($conn);
    echo 'Статус соединения: ' . ($status === PGSQL_CONNECTION_OK ? 'OK' : 'BAD');
} else {
    echo 'Не удалось установить соединение';
}
Статус соединения: OK
Проверка статуса после разрыва
$conn = pg_connect('host=localhost port=5432 dbname=test user=postgres');
pg_close($conn);
$status = pg_connection_status($conn);
echo 'Статус после закрытия: ' . ($status === PGSQL_CONNECTION_OK ? 'OK' : 'BAD');
Статус после закрытия: BAD

Похожие функции в PHP

Функция pg_connection_busy() проверяет, занято ли соединение выполнением запроса. Она полезна при асинхронных запросах для определения возможности отправки нового.

Функция pg_ping() проверяет работоспособность соединения и пытается переподключиться при его разрыве. pg_connection_status() только возвращает статус, не предпринимая действий по восстановлению.

pg_host и pg_port

Функции pg_host(), pg_port(), pg_options(), pg_dbname() предоставляют информацию о параметрах соединения, но не о его текущем состоянии.

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

Python (psycopg2)
import psycopg2
conn = psycopg2.connect('dbname=test user=postgres')
print(conn.closed)  # 0 - соединение открыто
conn.close()
print(conn.closed)  # 1 - соединение закрыто
0
1
JavaScript (node-postgres)
const { Client } = require('pg');
const client = new Client();
await client.connect();
console.log(client._connected); // true
await client.end();
console.log(client._connected); // false
true
false

Pg connection status в MySQL

В MySQL аналогом является проверка переменной статуса или выполнение простого запроса SELECT 1.

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

Передача неверного типа аргумента
$status = pg_connection_status('not_a_resource');
echo $status;
Warning: pg_connection_status() expects parameter 1 to be resource, string given
Использование неинициализированного соединения
$conn = null;
$status = pg_connection_status($conn);
echo $status;
Warning: pg_connection_status() expects parameter 1 to be resource, null given
Попытка проверки статуса после pg_close

Ресурс соединения после закрытия становится недействительным. Проверка статуса может вызвать предупреждение, как показано выше.

История изменений

В PHP 8.0 функция была переведена в разряд строго типизированных. Теперь при передаче аргумента некорректного типа выбрасывается исключение TypeError. Ранее выдавалось предупреждение и возвращалось значение PGSQL_CONNECTION_BAD.

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

Мониторинг в фоновом процессе
// Долгоживущий скрипт, проверяющий соединение каждые 5 секунд
$conn = pg_connect('host=localhost dbname=test user=postgres', PGSQL_CONNECT_FORCE_NEW);
while (true) {
    $status = pg_connection_status($conn);
    if ($status === PGSQL_CONNECTION_BAD) {
        error_log('Соединение с БД разорвано в ' . date('Y-m-d H:i:s'));
        // Попытка восстановления
        $conn = pg_connect('host=localhost dbname=test user=postgres', PGSQL_CONNECT_FORCE_NEW);
    }
    sleep(5);
}
Асинхронная проверка нескольких соединений
$connections = [
    'main' => pg_connect('host=db1 dbname=test'),
    'replica' => pg_connect('host=db2 dbname=test')
];
foreach ($connections as $name => $conn) {
    if (pg_connection_status($conn) === PGSQL_CONNECTION_OK) {
        echo "Соединение $name активно\n";
    } else {
        echo "Соединение $name неактивно\n";
    }
}
Соединение main активно
Соединение replica активно
Интеграция с pg_send_query
$conn = pg_connect('host=localhost dbname=test');
pg_send_query($conn, 'SELECT pg_sleep(10)'); // Долгий запрос
while (pg_connection_busy($conn)) {
    echo 'Запрос выполняется. Статус соединения: ' . 
         (pg_connection_status($conn) === PGSQL_CONNECTION_OK ? 'OK' : 'BAD') . "\n";
    sleep(1);
}

PHP pg_connection_status function comments

En
Pg connection status Get connection status