Pg ping: примеры (PHP)
pg_ping(?PgSql\Connection $connection = null): boolФункция pg_ping проверяет статус подключения к серверу PostgreSQL. Она используется для проверки работоспособности соединения с базой данных, особенно в долгоживущих скриптах или приложениях, где соединение может разрываться из-за сетевых проблем или таймаутов сервера.
Функция отправляет пустой запрос на сервер и анализирует ответ, определяя, активно ли соединение.
Функция принимает один необязательный аргумент:
- $connection (ресурс подключения) – Идентификатор соединения с базой данных PostgreSQL. Если аргумент не передан или равен
null, используется последнее открытое соединение.
Возвращает true, если соединение активно, и false, если соединение разорвано.
$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)
Возвращает константу, указывающую состояние соединения: PGSQL_CONNECTION_OK или PGSQL_CONNECTION_BAD. В отличие от pg_ping, не отправляет запрос на сервер, а проверяет локальное состояние соединения.
$status = pg_connection_status($conn);
if ($status === PGSQL_CONNECTION_OK) {
echo 'Соединение в порядке.';
}
pg_ping предпочтительнее, когда требуется гарантированная проверка доступности сервера, так как она отправляет реальный запрос. pg_connection_status быстрее, но может не обнаружить сетевые проблемы, возникшие после установки соединения.
Свойство connection.closed проверяет состояние, но для реальной проверки используется метод ping() или выполнение простого запроса.
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
try:
conn.ping() # или cursor.execute("SELECT 1")
print("Соединение активно")
except:
print("Соединение разорвано")
Проверка через метод query с простым SQL-запросом.
client.query('SELECT 1', (err) => {
if (err) console.log("Соединение разорвано");
else console.log("Соединение активно");
});
Аналогичная функция в 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.1.0 параметр $connection стал необязательным (?resource). Если передано значение null, функция использует последнее соединение по умолчанию, что делает поведение более предсказуемым.
// Работает в PHP 8.1.0 и выше
pg_connect("host=localhost dbname=test user=postgres");
var_dump(pg_ping(null)); // Явная передача null
В предыдущих версиях передача null могла вызывать предупреждение.
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();
// Использование соединения
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();
}
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
)