Pg host: примеры (PHP)
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.
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$host = pg_host($conn);
echo 'Хост подключения: ' . htmlspecialchars($host);
pg_close($conn);
?>
Хост подключения: localhost
<?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
Для получения информации о подключении к PostgreSQL существуют и другие функции.
Эти функции создают новое соединение или возвращают существующее. Они не возвращают информацию о хосте, но принимают строку подключения, в которой хост указан явно. pg_host полезна, когда нужно получить хост из уже установленного соединения.
Возвращает строку параметров, переданную при соединении, которая может содержать и имя хоста. Однако её разбор для извлечения конкретного параметра менее удобен, чем прямое использование pg_host.
Запрашивает параметры сервера. Не предоставляет информации о сетевом имени хоста клиентского подключения, но может сообщить, например, версию сервера.
Атрибут .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
Объект клиента или пула содержит конфигурацию в свойстве .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
Функция mysqli_get_host_info() возвращает строку, описывающую тип подключения, включая имя хоста.
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
echo $mysqli->host_info; // Использование свойства объекта
?>
localhost via TCP/IP
<?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)
Решение: Всегда проверяйте успешность установки соединения перед использованием.
<?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<?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");
?>
<?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
<?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 разрешено для выполнения критических операций.