Pg parameter status: примеры (PHP)
pg_parameter_status(PgSql\Connection $connection, string $name): string|falseФункция pg_parameter_status в PHP
Функция pg_parameter_status() предназначена для получения значений параметров сервера PostgreSQL. Она обращается к информации, которую сервер передает при установке соединения или в ходе сессии.
Функция применяется при необходимости узнать настройки сервера баз данных. Эти данные могут потребоваться для отладки, логирования или адаптации поведения приложения к конкретной конфигурации PostgreSQL.
Функция принимает два аргумента:
- $connection (ресурс соединения) – необязательный параметр. Указывает на активное подключение к серверу PostgreSQL. Если соединение не передано, используется последнее соединение, открытое функцией pg_connect().
- $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 аналогом является атрибут 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
В Node.js параметры можно получить из объекта подключения после установки соединения.
const { Client } = require('pg');
const client = new Client();
await client.connect();
console.log(client.connectionParameters);
// Конкретные параметры могут быть доступны в serverParametersPg 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.
Расширенные примеры использования
Проверка версии сервера для выбора синтаксиса запроса.
$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);Сбор информации о сессии для отладки.
$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 для выбора формата временных меток.
$conn = pg_connect("host=localhost dbname=test user=postgres");
$intDatetimes = pg_parameter_status($conn, 'integer_datetimes');
if ($intDatetimes === 'on') {
echo 'Сервер использует целочисленное представление даты и времени';
} else {
echo 'Сервер использует floating-point представление даты и времени';
}Сервер использует целочисленное представление даты и времени
Проверка соответствия кодировок.
$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;
}