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

Использование pg_options для настройки подключений PostgreSQL в PHP
Раздел: Базы данных (PostgreSQL)
pg_options(?PgSql\Connection $connection = null): string
Описание функции pg_options

Функция pg_options возвращает строку параметров подключения, ассоциированную с указанным идентификатором соединения PostgreSQL. Она применяется для получения текущих настроек подключения к базе данных.

Синтаксис и параметры
pg_options(?resource $connection = null): string|false

Аргументы:

  • connection (необязательный) - ресурс соединения с базой данных PostgreSQL. Если аргумент не передан или равен null, используется последнее установленное соединение.

Возвращаемые значения:

  • Строка с параметрами подключения в формате параметр=значение, разделенные пробелами.
  • false - при возникновении ошибки.
Базовые примеры использования
Получение параметров текущего соединения
$conn = pg_connect("host=localhost port=5432 dbname=test user=postgres password=secret");
echo pg_options($conn);
host=localhost port=5432 dbname=test user=postgres
Использование без явного указания соединения
pg_connect("host=192.168.1.10 dbname=mydb");
$options = pg_options();
echo $options;
host=192.168.1.10 dbname=mydb
Обработка ошибки подключения
$invalid_conn = false;
$result = pg_options($invalid_conn);
var_dump($result);
bool(false)
Похожие функции в PHP

Получает текущее значение указанного параметра сервера, например server_version или client_encoding. Используется для получения отдельных настроек вместо всей строки подключения.

pg_host, pg_dbname, pg_port, pg_user

Эти функции возвращают отдельные компоненты подключения: хост, имя базы данных, порт и пользователя соответственно. Удобны для извлечения конкретных значений без разбора строки параметров.

Создает новое подключение и возвращает ресурс соединения. Может использоваться совместно с pg_options для проверки параметров установленного подключения.

Распространенные ошибки
Передача несуществующего соединения
$closed_conn = pg_connect("host=localhost");
pg_close($closed_conn);
$options = pg_options($closed_conn);
var_dump($options);
bool(false)
Использование после разрыва подключения
$conn = pg_connect("host=localhost");
if (!$conn) {
    echo "Не удалось подключиться";
    $options = pg_options($conn);
    var_dump($options);
}
bool(false)
Попытка получить пароль из параметров
$conn = pg_connect("host=localhost password=secret123");
$options = pg_options($conn);
echo $options;
host=localhost

Пароль никогда не возвращается функцией из соображений безопасности.

Изменения в версиях PHP

Начиная с PHP 8.0, функция pg_options выбрасывает исключение TypeError при передаче аргумента неподдерживаемого типа. Ранее в таких случаях возвращалось false.

// PHP 7.x и ранее
pg_options('invalid_argument'); // возвращал false

// PHP 8.0+
pg_options('invalid_argument'); // TypeError

В PHP 8.1 были улучшены сообщения об ошибках при работе с недействительными ресурсами соединений.

Расширенные примеры
Анализ параметров подключения
Пример php
function parse_pg_options($connection) {
    $optionsString = pg_options($connection);
    if ($optionsString === false) return null;
    
    $params = [];
    $pairs = explode(' ', $optionsString);
    foreach ($pairs as $pair) {
        list($key, $value) = explode('=', $pair, 2);
        $params[$key] = $value;
    }
    return $params;
}

$conn = pg_connect("host=127.0.0.1 port=5433 dbname=appdb");
print_r(parse_pg_options($conn));
Array
(
    [host] => 127.0.0.1
    [port] => 5433
    [dbname] => appdb
)
Логирование параметров подключения
Пример php
class PGConnectionLogger {
    private $connections = [];
    
    public function connect($connectionString) {
        $conn = pg_connect($connectionString);
        if ($conn) {
            $this->connections[] = [
                'resource' => $conn,
                'options' => pg_options($conn),
                'time' => time()
            ];
        }
        return $conn;
    }
    
    public function getLog() {
        return $this->connections;
    }
}

$logger = new PGConnectionLogger();
$conn1 = $logger->connect("host=db1.example.com");
$conn2 = $logger->connect("host=db2.example.com dbname=backup");
print_r($logger->getLog());
Сравнение параметров двух подключений
Пример php
function compare_connections($conn1, $conn2) {
    $opts1 = pg_options($conn1);
    $opts2 = pg_options($conn2);
    
    if ($opts1 === false || $opts2 === false) {
        return false;
    }
    
    return $opts1 === $opts2;
}

$connA = pg_connect("host=localhost");
$connB = pg_connect("host=localhost");
$connC = pg_connect("host=192.168.1.1");

var_dump(compare_connections($connA, $connB));
var_dump(compare_connections($connA, $connC));
bool(true)
bool(false)
Восстановление строки подключения из параметров
Пример php
function recreate_connection_string($connection) {
    $options = pg_options($connection);
    if ($options === false) {
        throw new Exception('Invalid connection');
    }
    
    // Добавляем параметры, которые не возвращаются pg_options
    return $options . ' sslmode=require'; // пример добавления параметра
}

$conn = pg_connect("host=localhost user=admin");
echo recreate_connection_string($conn);
host=localhost user=admin sslmode=require
Аналоги в других языках
Python (psycopg2)
import psycopg2
conn = psycopg2.connect(host='localhost', dbname='test', user='postgres')
print(conn.dsn)
dbname='test' user='postgres' host='localhost'
Node.js (pg)
const { Client } = require('pg');
const client = new Client({ host: 'localhost', user: 'postgres' });
console.log(client.connectionParameters);
{ host: 'localhost', user: 'postgres' }

Pg options в MySQL

В MySQL аналогом можно считать выполнение запроса SELECT CURRENT_USER(), DATABASE() для получения информации о текущем подключении.

PHP pg_options function comments

En
Pg options Get the options associated with the connection