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

Постоянные подключения к PostgreSQL через pg_pconnect в PHP
Раздел: Базы данных (PostgreSQL)
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 PostgreSQL

Расширение PDO предоставляет универсальный интерфейс для работы с разными СУБД. Поддерживает подготовленные выражения и объектно-ориентированный стиль. Предпочтительнее для кроссплатформенных приложений.

// Пример PDO подключения
$pdo = new PDO('pgsql:host=localhost;dbname=test', 'user', 'password');

Аналоги в других языках

Python (psycopg2)
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()
JavaScript (node-postgres)
const { Pool } = require('pg');

// Пул соединений
const pool = new Pool({
  host: 'localhost',
  database: 'test',
  max: 20, // максимальное количество соединений
});
MySQL (PHP)
// Постоянное соединение в 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

PHP 8.1

Добавлена поддержка константы PGSQL_CONNECT_ASYNC для асинхронных подключений. Возвращаемый тип изменен с resource на объект PgSql\Connection.

PHP 8.0

Улучшена обработка ошибок, устаревшие параметры удалены. Функция теперь выбрасывает исключения вместо генерации предупреждений в некоторых случаях.

// Новый стиль обработки ошибок в PHP 8+
try {
    $conn = pg_pconnect("host=invalid_host");
} catch (Exception $e) {
    echo 'Ошибка: '. $e->getMessage();
}

Расширенные примеры

Использование в классе с Singleton
Пример php
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()");
Множественные постоянные соединения
Пример php
// Разные соединения для разных баз данных
$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
Работа с таймаутами
Пример php
// Установка таймаута подключения
$conn = pg_pconnect("host=slow.server connect_timeout=3");
if (!$conn) {
    echo 'Не удалось подключиться за 3 секунды';
}

// Установка параметров через options
$conn2 = pg_pconnect("host=localhost options='-c statement_timeout=5000'");
Мониторинг соединений
Пример php
// Проверка статуса постоянного соединения
$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;
SSLMODE параметры
Пример php
// Безопасное подключение с SSL
$conn_ssl = pg_pconnect(
    "host=dbserver sslmode=verify-full sslrootcert=ca.pem"
);

// Отключение SSL для локального подключения
$conn_local = pg_pconnect("host=localhost sslmode=disable");

PHP pg_pconnect function comments

En
Pg pconnect Open a persistent PostgreSQL connection