Pg pconnect: примеры (PHP)
pg_pconnect(string $connection_string, int $flags = 0): PgSql\Connection|falseОсновы функции pg_pconnect
Функция pg_pconnect создает постоянное соединение с сервером PostgreSQL. В отличие от pg_connect, постоянное соединение не закрывается после завершения выполнения скрипта, а остается доступным для повторного использования другими запросами.
Постоянные соединения применяются для снижения накладных расходов на установку подключения к базе данных в скриптах, которые выполняются часто. Это особенно эффективно для веб-приложений с высокой нагрузкой.
pg_pconnect(string $connection_string, int $flags = 0): PgSql\Connection|false
$connection_string - строка подключения, которая может содержать следующие параметры: host, port, dbname, user, password, connect_timeout, options, sslmode, service.
$flags - комбинация констант: PGSQL_CONNECT_FORCE_NEW (принудительно создает новое соединение), PGSQL_CONNECT_ASYNC (асинхронное подключение).
Базовые примеры использования
// Подключение с минимальными параметрами
$conn = pg_pconnect("host=localhost dbname=test user=postgres password=secret");
if ($conn) {
echo 'Соединение установлено';
} else {
echo 'Ошибка подключения';
}Соединение установлено
// Принудительное создание нового соединения
$conn1 = pg_pconnect("host=localhost dbname=test", PGSQL_CONNECT_FORCE_NEW);
// Асинхронное подключение (PHP 8.1+)
$conn2 = pg_pconnect("host=localhost", PGSQL_CONNECT_ASYNC);Ресурс соединения создан в обоих случаях
// Полная строка подключения
$conn = pg_pconnect("host=127.0.0.1 port=5432 dbname=mydb user=admin password=pass123 connect_timeout=10");
// Использование service-файла
$conn2 = pg_pconnect("service=myservice");Альтернативные функции в PHP
Создает обычное (непостоянное) соединение. Закрывается автоматически после выполнения скрипта. Рекомендуется для скриптов с длительным временем выполнения или при необходимости полного контроля над жизненным циклом соединения.
Расширение PDO предоставляет универсальный интерфейс для работы с разными СУБД. Поддерживает подготовленные выражения и объектно-ориентированный стиль. Предпочтительнее для кроссплатформенных приложений.
// Пример PDO подключения
$pdo = new PDO('pgsql:host=localhost;dbname=test', 'user', 'password');Аналоги в других языках
import psycopg2
from psycopg2 import pool
# Простое подключение
conn = psycopg2.connect("host=localhost dbname=test")
# Пул соединений (аналог pg_pconnect)
connection_pool = pool.SimpleConnectionPool(
1, 10, host='localhost', database='test'
)
conn = connection_pool.getconn()const { Pool } = require('pg');
// Пул соединений
const pool = new Pool({
host: 'localhost',
database: 'test',
max: 20, // максимальное количество соединений
});// Постоянное соединение в MySQL
$mysqli = new mysqli('p:localhost', 'user', 'password', 'database');Типичные ошибки
// Неверный пароль
$conn = pg_pconnect("host=localhost user=postgres password=wrong");
$result = pg_query($conn, "SELECT 1");
echo pg_last_error($conn);FATAL: password authentication failed for user "postgres"
// Многократное создание соединений в цикле
for ($i = 0; $i < 1000; $i++) {
$conn = pg_pconnect("host=localhost");
}Предупреждение: превышен лимит подключений к PostgreSQL
// Явное закрытие постоянного соединения
$conn = pg_pconnect("host=localhost");
pg_close($conn);
$result = pg_query($conn, "SELECT 1"); // ОшибкаWarning: pg_query(): supplied resource is not a valid PostgreSQL link resource
Изменения в новых версиях PHP
Добавлена поддержка константы PGSQL_CONNECT_ASYNC для асинхронных подключений. Возвращаемый тип изменен с resource на объект PgSql\Connection.
Улучшена обработка ошибок, устаревшие параметры удалены. Функция теперь выбрасывает исключения вместо генерации предупреждений в некоторых случаях.
// Новый стиль обработки ошибок в PHP 8+
try {
$conn = pg_pconnect("host=invalid_host");
} catch (Exception $e) {
echo 'Ошибка: '. $e->getMessage();
}Расширенные примеры
class Database {
private static $connection = null;
public static function getConnection() {
if (self::$connection === null) {
self::$connection = pg_pconnect(
"host=localhost dbname=app user=app_user",
PGSQL_CONNECT_FORCE_NEW
);
}
return self::$connection;
}
}
$db = Database::getConnection();
$result = pg_query($db, "SELECT version()");// Разные соединения для разных баз данных
$conn_main = pg_pconnect("host=localhost dbname=main");
$conn_logs = pg_pconnect("host=localhost dbname=logs", PGSQL_CONNECT_FORCE_NEW);
// Проверка различных соединений
echo pg_dbname($conn_main); // main
echo pg_dbname($conn_logs); // logs// Установка таймаута подключения
$conn = pg_pconnect("host=slow.server connect_timeout=3");
if (!$conn) {
echo 'Не удалось подключиться за 3 секунды';
}
// Установка параметров через options
$conn2 = pg_pconnect("host=localhost options='-c statement_timeout=5000'");// Проверка статуса постоянного соединения
$conn = pg_pconnect("host=localhost");
$status = pg_connection_status($conn);
if ($status === PGSQL_CONNECTION_OK) {
echo 'Соединение активно';
} else {
echo 'Соединение разорвано';
}
// Получение статистики
$stat = pg_connection_busy($conn) ? 'Занято' : 'Свободно';
echo 'Статус: '. $stat;// Безопасное подключение с SSL
$conn_ssl = pg_pconnect(
"host=dbserver sslmode=verify-full sslrootcert=ca.pem"
);
// Отключение SSL для локального подключения
$conn_local = pg_pconnect("host=localhost sslmode=disable");