Pg connection status: примеры (PHP)
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_options(), pg_dbname() предоставляют информацию о параметрах соединения, но не о его текущем состоянии.
Аналоги в других языках программирования
import psycopg2
conn = psycopg2.connect('dbname=test user=postgres')
print(conn.closed) # 0 - соединение открыто
conn.close()
print(conn.closed) # 1 - соединение закрыто0 1
const { Client } = require('pg');
const client = new Client();
await client.connect();
console.log(client._connected); // true
await client.end();
console.log(client._connected); // falsetrue 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
Ресурс соединения после закрытия становится недействительным. Проверка статуса может вызвать предупреждение, как показано выше.
История изменений
В 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 активно
$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);
}