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

Проверка активности соединения PostgreSQL с pg_ping
Раздел: Базы данных (PostgreSQL)
pg_ping(?PgSql\Connection $connection = null): bool
Описание функции pg_ping

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

Функция отправляет пустой запрос на сервер и анализирует ответ, определяя, активно ли соединение.

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

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

  • $connection (ресурс подключения) – Идентификатор соединения с базой данных PostgreSQL. Если аргумент не передан или равен null, используется последнее открытое соединение.
Возвращаемое значение

Возвращает true, если соединение активно, и false, если соединение разорвано.

Примеры использования pg_ping
Простая проверка соединения
$conn = pg_connect("host=localhost dbname=test user=postgres");
if (pg_ping($conn)) {
    echo 'Соединение активно.';
} else {
    echo 'Соединение разорвано.';
}
Соединение активно.
Использование последнего соединения
pg_connect("host=localhost dbname=test user=postgres");
var_dump(pg_ping());
bool(true)
Обработка разорванного соединения
$conn = pg_connect("host=localhost dbname=test user=postgres");
// Имитация разрыва соединения
pg_close($conn);
var_dump(pg_ping($conn));
bool(false)
Похожие функции в PHP

Возвращает константу, указывающую состояние соединения: PGSQL_CONNECTION_OK или PGSQL_CONNECTION_BAD. В отличие от pg_ping, не отправляет запрос на сервер, а проверяет локальное состояние соединения.

$status = pg_connection_status($conn);
if ($status === PGSQL_CONNECTION_OK) {
    echo 'Соединение в порядке.';
}
Когда использовать

pg_ping предпочтительнее, когда требуется гарантированная проверка доступности сервера, так как она отправляет реальный запрос. pg_connection_status быстрее, но может не обнаружить сетевые проблемы, возникшие после установки соединения.

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

Свойство connection.closed проверяет состояние, но для реальной проверки используется метод ping() или выполнение простого запроса.

import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
try:
    conn.ping()  # или cursor.execute("SELECT 1")
    print("Соединение активно")
except:
    print("Соединение разорвано")
JavaScript (Node.js, библиотека pg)

Проверка через метод query с простым SQL-запросом.

client.query('SELECT 1', (err) => {
    if (err) console.log("Соединение разорвано");
    else console.log("Соединение активно");
});
MySQL (функция mysqli_ping)

Аналогичная функция в PHP для MySQL.

$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->ping()) {
    echo "Соединение с MySQL активно";
}
Типичные ошибки
Передача несуществующего соединения
$conn = null;
var_dump(pg_ping($conn));
Warning: pg_ping() expects parameter 1 to be resource, null given
Использование без открытого соединения
var_dump(pg_ping());
Warning: pg_ping(): No PostgreSQL link opened yet
Попытка использования закрытого соединения
$conn = pg_connect("host=localhost dbname=test user=postgres");
pg_close($conn);
if (pg_ping($conn)) { // Неверно
    echo 'Соединение все еще открыто?';
}
Warning: pg_ping(): supplied resource is not a valid PostgreSQL link resource
Изменения в PHP 8

В PHP 8.1.0 параметр $connection стал необязательным (?resource). Если передано значение null, функция использует последнее соединение по умолчанию, что делает поведение более предсказуемым.

// Работает в PHP 8.1.0 и выше
pg_connect("host=localhost dbname=test user=postgres");
var_dump(pg_ping(null)); // Явная передача null

В предыдущих версиях передача null могла вызывать предупреждение.

Расширенные примеры
Автоматическое восстановление соединения
Пример php
function getConnection() {
    static $conn = null;
    if ($conn === null || !pg_ping($conn)) {
        $conn = pg_connect("host=localhost dbname=test user=postgres");
        echo "Установлено новое соединение.\n";
    }
    return $conn;
}
$conn = getConnection();
// Использование соединения
Проверка перед выполнением запроса
Пример php
function safeQuery($conn, $sql) {
    if (!pg_ping($conn)) {
        throw new Exception("Соединение с базой данных потеряно.");
    }
    return pg_query($conn, $sql);
}
try {
    $result = safeQuery($conn, "SELECT * FROM users");
} catch (Exception $e) {
    echo $e->getMessage();
}
Интеграция в мониторинг
Пример php
class DatabaseHealthCheck {
    private $connections = [];
    public function addConnection($name, $conn) {
        $this->connections[$name] = $conn;
    }
    public function checkAll() {
        $report = [];
        foreach ($this->connections as $name => $conn) {
            $report[$name] = pg_ping($conn) ? 'OK' : 'FAILED';
        }
        return $report;
    }
}
$health = new DatabaseHealthCheck();
$health->addConnection('main', pg_connect("host=localhost dbname=test"));
print_r($health->checkAll());
Array
(
    [main] => OK
)

PHP pg_ping function comments

En
Pg ping Ping database connection