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

Использование pg_host для определения хоста базы данных
Раздел: Базы данных (PostgreSQL)
pg_host(?PgSql\Connection $connection = null): string

Функция pg_host возвращает имя хоста, связанное с указанным соединением PostgreSQL.

Назначение и использование

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

Синтаксис
pg_host(?PgSql\Connection $connection = null): string|false
Аргументы

$connection (необязательный): Экземпляр класса PgSql\Connection. Если аргумент не передан или равен null, функция использует соединение по умолчанию. Если соединение по умолчанию отсутствует, будет вызвана ошибка уровня E_WARNING.

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

Возвращает строку (string), содержащую имя хоста сервера PostgreSQL. В случае ошибки возвращает false.

Базовые примеры использования
Пример 1: Использование с явным соединением
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$host = pg_host($conn);
echo 'Хост подключения: ' . htmlspecialchars($host);
pg_close($conn);
?>
Хост подключения: localhost
Пример 2: Использование соединения по умолчанию
<?php
// Первое соединение становится соединением по умолчанию
$conn1 = pg_connect("host=db1.example.com dbname=app user=app_user");
// Второе соединение с другим хостом
$conn2 = pg_connect("host=db2.example.com dbname=app user=app_user", PGSQL_CONNECT_FORCE_NEW);

// pg_host() без аргументов использует соединение по умолчанию ($conn1)
echo 'Хост по умолчанию: ' . pg_host(); // Выведет db1.example.com
echo 'Хост второго соединения: ' . pg_host($conn2); // Выведет db2.example.com
?>
Хост по умолчанию: db1.example.com
Хост второго соединения: db2.example.com
Похожие функции в PHP

Для получения информации о подключении к PostgreSQL существуют и другие функции.

pg_connect() / pg_pconnect()

Эти функции создают новое соединение или возвращают существующее. Они не возвращают информацию о хосте, но принимают строку подключения, в которой хост указан явно. pg_host полезна, когда нужно получить хост из уже установленного соединения.

Возвращает строку параметров, переданную при соединении, которая может содержать и имя хоста. Однако её разбор для извлечения конкретного параметра менее удобен, чем прямое использование pg_host.

Запрашивает параметры сервера. Не предоставляет информации о сетевом имени хоста клиентского подключения, но может сообщить, например, версию сервера.

Аналоги в других языках и системах
Python (psycopg2)

Атрибут .dsn объекта подключения содержит строку подключения, атрибут .info предоставляет более структурированные данные.

import psycopg2
conn = psycopg2.connect("host=localhost dbname=test")
# Прямого аналога pg_host() нет, хост можно извлечь из .dsn
print(f"DSN строка: {conn.dsn}")
# Или получить параметры как словарь
params = conn.get_dsn_parameters()
print(f"Хост из параметров: {params.get('host')}")
DSN строка: host=localhost dbname=test
Хост из параметров: localhost
JavaScript (Node.js, библиотека 'pg')

Объект клиента или пула содержит конфигурацию в свойстве .config.

const { Client } = require('pg');
const client = new Client({
  host: 'localhost',
  database: 'test'
});
// Перед подключением хост доступен в конфигурации
console.log(`Хост для подключения: ${client.config.host}`);
await client.connect();
// После подключения можно получить данные о текущем соединении
const res = await client.query('SELECT inet_server_addr()');
console.log(`Адрес сервера (SQL): ${res.rows[0].inet_server_addr}`);
Хост для подключения: localhost
Адрес сервера (SQL): 127.0.0.1
MySQL (PHP функции mysqli)

Функция mysqli_get_host_info() возвращает строку, описывающую тип подключения, включая имя хоста.

<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
echo $mysqli->host_info; // Использование свойства объекта
?>
localhost via TCP/IP
Типичные ошибки и их обработка
Ошибка 1: Использование с недействительным ресурсом соединения
<?php
$invalid_conn = null; // Или несуществующий ресурс
$result = pg_host($invalid_conn);
var_dump($result);
?>

Warning: pg_host() expects parameter 1 to be PgSql\Connection, null given in ... on line 3
bool(false)

Решение: Всегда проверяйте успешность установки соединения перед использованием.

Ошибка 2: Отсутствие соединения по умолчанию
<?php
// Нет активного соединения по умолчанию
$host = pg_host(); // Вызовет предупреждение
?>

Warning: pg_host(): No PostgreSQL link opened yet in ... on line 3

Решение: Явно передавайте соединение в функцию или убедитесь, что соединение по умолчанию установлено.

История изменений

В PHP 8.1.0 тип параметра и возвращаемого значения был изменён с resource на PgSql\Connection и string|false соответственно. Ранее функция возвращала строку или false, а параметр был ресурсом (resource). Это изменение связано с переходом на типизированные объекты для расширений.

Версии до PHP 8.1.0 использовали ресурсы PostgreSQL.

// До PHP 8.1.0
$host = pg_host($connection); // $connection был ресурсом (resource)
// Начиная с PHP 8.1.0
$host = pg_host($connection); // $connection - объект PgSql\Connection
Расширенные примеры использования
Пример 1: Мониторинг и логирование подключений
Пример php
<?php
function connectWithLogging($connStr) {
    $conn = pg_connect($connStr);
    if ($conn) {
        $logMessage = sprintf(
            "[%s] Установлено подключение к хосту: %s",
            date('Y-m-d H:i:s'),
            pg_host($conn)
        );
        error_log($logMessage);
        // Можно также сохранить в базу или файл
        file_put_contents('db_connections.log', $logMessage . PHP_EOL, FILE_APPEND);
    }
    return $conn;
}

$conn = connectWithLogging("host=production-db.example.com dbname=app");
?>
Пример 2: Динамическая маршрутизация запросов
Пример php
<?php
// Предположим, есть несколько серверов для чтения
$readOnlyServers = [
    'ro1.example.com',
    'ro2.example.com'
];

$masterConn = pg_connect("host=master.example.com");

// Функция для получения соединения для чтения
function getReadOnlyConnection() {
    global $readOnlyServers;
    static $lastUsed = 0;
    // Простая round-robin логика
    $host = $readOnlyServers[$lastUsed % count($readOnlyServers)];
    $lastUsed++;
    return pg_connect("host=$host", PGSQL_CONNECT_FORCE_NEW);
}

$roConn = getReadOnlyConnection();
// Проверяем, к какому хосту мы подключились
$currentReadHost = pg_host($roConn);
echo "Запросы на чтение направлены на: $currentReadHost";
?>
Запросы на чтение направлены на: ro1.example.com
Пример 3: Сравнение хостов в распределённой системе
Пример php
<?php
$connA = pg_connect("host=192.168.1.10", PGSQL_CONNECT_FORCE_NEW);
$connB = pg_connect("host=192.168.1.10", PGSQL_CONNECT_FORCE_NEW); // Тот же хост
$connC = pg_connect("host=192.168.1.11", PGSQL_CONNECT_FORCE_NEW); // Другой хост

// Сравнение строк, возвращаемых pg_host
if (pg_host($connA) === pg_host($connB)) {
    echo "Соединения A и B установлены к одному хосту." . PHP_EOL;
}
if (pg_host($connA) !== pg_host($connC)) {
    echo "Соединения A и C установлены к разным хостам." . PHP_EOL;
}

// Можно использовать для условной логики
$allowedHosts = ['192.168.1.10', 'localhost'];
if (in_array(pg_host($connA), $allowedHosts, true)) {
    echo "Соединение A разрешено для выполнения критических операций.";
}
?>
Соединения A и B установлены к одному хосту.
Соединения A и C установлены к разным хостам.
Соединение A разрешено для выполнения критических операций.

PHP pg_host function comments

En
Pg host Returns the host name associated with the connection