Pg connection reset: примеры (PHP)
pg_connection_reset(PgSql\Connection $connection): boolФункция pg_connection_reset сбрасывает подключение к серверу PostgreSQL. Она закрывает текущее соединение и пытается переподключиться с теми же параметрами, которые использовались изначально. Это полезно при восстановлении после временных сетевых сбоев или при необходимости очистки состояния соединения без создания нового ресурса.
Функция принимает один обязательный параметр:
- $connection (ресурс PgSql\Connection) — ресурс соединения с базой данных PostgreSQL, возвращаемый функциями pg_connect или pg_pconnect.
Возвращает true при успешном сбросе или false в случае неудачи.
Простейший пример сброса соединения:
$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
Прямых аналогов pg_connection_reset в PHP нет, но существуют другие функции для управления соединениями:
- pg_connect — создает новое соединение. Используется, когда нужно полностью пересоздать подключение с новыми параметрами.
- pg_close — закрывает соединение. Применяется для явного освобождения ресурсов, но не позволяет автоматически переподключиться.
- pg_ping — проверяет состояние соединения. Подходит для проверки работоспособности без разрыва подключения.
Функцию pg_connection_reset предпочтительнее использовать при необходимости восстановления соединения после сбоя с сохранением исходных параметров подключения.
Используется метод reconnect() объекта соединения:
import psycopg2
conn = psycopg2.connect("dbname=test")
conn.close()
# В psycopg2 нет прямой аналогии, обычно пересоздают соединение:
conn = psycopg2.connect("dbname=test")Клиент автоматически управляет переподключением, но можно принудительно завершить соединение:
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);
// Генерируется предупреждение и возвращается falseWarning: 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 8.1, параметр $connection ожидает объект PgSql\Connection вместо ресурса. Передача ресурса вызывает устаревшее предупреждение. В PHP 8.3 существенных изменений в работе функции не было.
// До PHP 8.1
$conn = pg_connect(...); // ресурс
// PHP 8.1+
$conn = pg_connect(...); // объект PgSql\Connectionfunction 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");$conn = pg_connect("host=localhost");
// Имитация разрыва (например, перезагрузка сервера БД)
if (pg_connection_status($conn) === PGSQL_CONNECTION_BAD) {
echo 'Статус: BAD. Пытаемся сбросить...';
if (pg_connection_reset($conn)) {
echo 'Соединение восстановлено';
// Теперь статус должен быть PGSQL_CONNECTION_OK
}
}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;
});$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