Pg parameter status: примеры (PHP)

Использование pg_parameter_status для работы с PostgreSQL в PHP
Раздел: Базы данных (PostgreSQL)
pg_parameter_status(PgSql\Connection $connection, string $name): string|false

Функция pg_parameter_status в PHP

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

Когда используется

Функция применяется при необходимости узнать настройки сервера баз данных. Эти данные могут потребоваться для отладки, логирования или адаптации поведения приложения к конкретной конфигурации PostgreSQL.

Аргументы функции

Функция принимает два аргумента:

  1. $connection (ресурс соединения) – необязательный параметр. Указывает на активное подключение к серверу PostgreSQL. Если соединение не передано, используется последнее соединение, открытое функцией pg_connect().
  2. $param_name (строка) – имя запрашиваемого параметра сервера. Распространенные имена: 'server_version', 'server_encoding', 'client_encoding', 'is_superuser', 'session_authorization', 'DateStyle', 'TimeZone', 'integer_datetimes', 'standard_conforming_strings'.

Функция возвращает значение параметра в виде строки, если параметр известен. В противном случае возвращает false.

Примеры использования pg_parameter_status

Базовый пример

Получение версии сервера и клиентской кодировки.

$conn = pg_connect("host=localhost dbname=test user=postgres");
echo pg_parameter_status($conn, 'server_version');
echo pg_parameter_status($conn, 'client_encoding');
15.3
UTF8
Пример без указания соединения

Если соединение активно, его можно не передавать.

$conn = pg_connect("host=localhost dbname=test user=postgres");
echo pg_parameter_status(null, 'TimeZone');
Europe/Moscow
Запрос неизвестного параметра

Попытка получить несуществующий параметр.

$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_parameter_status($conn, 'unknown_param');
var_dump($result);
bool(false)

Похожие функции в PHP

В PHP нет прямых аналогов, но существуют функции для получения метаинформации о соединении.

Функция pg_version() возвращает массив с версиями клиента, сервера и протокола. Она предоставляет более детальную информацию о версиях компонентов, в отличие от pg_parameter_status, которая возвращает только строку версии сервера.

Функция pg_escape_string() использует информацию о соединении для корректного экранирования строк. Она может зависеть от таких параметров, как 'standard_conforming_strings', которые можно получить через pg_parameter_status.

Функцию pg_parameter_status предпочтительнее использовать для чтения статических параметров сессии, в то время как pg_version дает информацию о программных версиях.

Альтернативы в других языках

Python (библиотека psycopg2)

В Python аналогом является атрибут connection.parameter_status.

import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
print(conn.parameter_status('server_version'))
print(conn.parameter_status('client_encoding'))
15.3
UTF8
JavaScript (библиотека node-postgres)

В Node.js параметры можно получить из объекта подключения после установки соединения.

const { Client } = require('pg');
const client = new Client();
await client.connect();
console.log(client.connectionParameters);
// Конкретные параметры могут быть доступны в serverParameters

Pg parameter status в MySQL

В MySQL аналогом являются запросы к переменным сервера через SHOW или SELECT.

SHOW VARIABLES LIKE 'version';
-- или
SELECT @@version;
+-------------------------+
| Variable_name | Value  |
+-------------------------+
| version      | 8.0.33 |
+-------------------------+

Основное отличие от подхода PHP в том, что в других языках часто используется прямой запрос к серверу, а не кэшированные данные соединения.

Типичные ошибки

Передача несуществующего соединения

Если передать недействительный ресурс соединения, функция вернет false и может сгенерировать предупреждение.

$result = pg_parameter_status('not_a_connection', 'server_version');
var_dump($result);
Warning: pg_parameter_status() expects parameter 1 to be resource, string given
bool(false)
Использование после закрытия соединения

Попытка использовать функцию после закрытия соединения приведет к ошибке.

$conn = pg_connect("host=localhost dbname=test user=postgres");
pg_close($conn);
$result = pg_parameter_status($conn, 'server_version');
var_dump($result);
Warning: pg_parameter_status(): supplied resource is not a valid PostgreSQL link resource
bool(false)
Неправильный тип параметра

Передача параметра имени не в виде строки.

$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_parameter_status($conn, 123);
var_dump($result);
bool(false)

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

В PHP 8.0 был изменен тип первого параметра $connection. Ранее он ожидался как ресурс (resource), теперь — как объект PgSql\Connection. Если передается ресурс, он автоматически преобразуется в объект. Это изменение связано с общей типизацией объектов расширений в PHP 8.

В PHP 8.1 серьезных изменений в работе функции не было. Однако, рекомендуется использовать объекты вместо ресурсов для совместимости с будущими версиями.

До PHP 8.0 функция могла возвращать значения параметров только в виде строк, теперь тип возвращаемого значения декларирован как string|false.

Расширенные примеры использования

Проверка параметров для адаптивного поведения

Проверка версии сервера для выбора синтаксиса запроса.

Пример php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$version = pg_parameter_status($conn, 'server_version');
$majorVersion = (int) explode('.', $version)[0];

if ($majorVersion >= 12) {
    // Использование возможностей PostgreSQL 12+
    $query = "CREATE TABLE test (id GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name text)";
} else {
    $query = "CREATE TABLE test (id SERIAL PRIMARY KEY, name text)";
}
pg_query($conn, $query);
Логирование параметров сессии

Сбор информации о сессии для отладки.

Пример php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$params = ['server_version', 'server_encoding', 'TimeZone', 'DateStyle', 'integer_datetimes'];
$sessionInfo = [];
foreach ($params as $param) {
    $value = pg_parameter_status($conn, $param);
    $sessionInfo[$param] = $value;
}
error_log('Session parameters: ' . print_r($sessionInfo, true));
Определение поддержки целочисленных дат-времени

Проверка параметра integer_datetimes для выбора формата временных меток.

Пример php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$intDatetimes = pg_parameter_status($conn, 'integer_datetimes');
if ($intDatetimes === 'on') {
    echo 'Сервер использует целочисленное представление даты и времени';
} else {
    echo 'Сервер использует floating-point представление даты и времени';
}
Сервер использует целочисленное представление даты и времени
Сравнение параметров клиента и сервера

Проверка соответствия кодировок.

Пример php
$conn = pg_connect("host=localhost dbname=test");
$serverEnc = pg_parameter_status($conn, 'server_encoding');
$clientEnc = pg_parameter_status($conn, 'client_encoding');
if ($serverEnc !== $clientEnc) {
    echo 'Кодировки клиента и сервера различаются. Сервер: ' . $serverEnc . ', Клиент: ' . $clientEnc;
}

PHP pg_parameter_status function comments

En
Pg parameter status Looks up a current parameter setting of the server